2011-12-21 2 views
1

У меня есть класс под названием Location, и он может быть Location<IClub> или Location<IRestaurant>.Создать объект с неизвестным интерфейсом

Я получаю запись из базы данных, и эта запись затем указывает, является ли это место рестораном или клубом.

Мне нужно создать местоположение на основе строкового значения внутри записи.

Я пробовал это сделать;

 object topLoc = null ; 

     if (record.type == "club") 
      topLoc = new Location<IClub>(); 

, но я не могу получить доступ к любому из свойств Location «s.

Я также не могу создать объект в выражении if, когда вы покидаете объект, если объект будет недоступен.

+0

У вас есть общий интерфейс, который вы можете использовать для обоих типов, что-то вроде ILocation вместо объекта? –

+0

Я могу сделать, но как я могу добавить интерфейс iClub или IRestaurant к объекту? – griegs

ответ

2

Похоже, что дженерики - это не тот инструмент, который вам нужен. Вместо использования дженериков для аннотирования типа местоположения рассмотрите возможность использования enum.

public enum LocationKind 
{ 
    Restaurant, 
    Club 
} 

Location location = new Location(LocationKind.Club); 
// set up & use location as you see fit; expose the LocationKind through a 
// property or something else along those lines 
+0

Хммм, да. В крайнем случае, но это потребует довольно много рефакторинга «старого» кода. griegs

+0

@griegs, в противном случае вы можете использовать ключевое слово 'dynamic' как тип' topLoc', но это означает, что вы делаете старую типизацию для этой части вашего кода. (Кроме того, для этого требуется использовать .NET Framework 4 или выше.) – zneak

+0

@griegs, еще один вариант - создать неэквивалентный суперкласс «Местоположение» (IIRC вы можете называть его «Местоположение»), который будет иметь все поля, которые не зависят от общего типа; хотя я бы рекомендовал этот подход только как временную меру, потому что вы обычно не хотите добавлять бессмысленное наследование. – zneak

Смежные вопросы