Доступ к неуниверсальным членам универсального объекта - PullRequest
3 голосов
/ 09 сентября 2008

Есть ли способ собрать (например, в списке) несколько «общих» объектов, которые не имеют общего суперкласса? Если так, как я могу получить доступ к их общим свойствам?

Например:

class MyObject<T>
{
   public T Value { get; set; }
   public string Name { get; set; }

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

Очевидно, что это псевдокод, это не работает.

Кроме того, мне не нужно обращаться к свойству .Value (поскольку это не безопасно для типов).

РЕДАКТИРОВАТЬ: Теперь, когда я думал об этом, можно было бы использовать подклассы для этого. Однако я думаю, что это означало бы, что мне придется писать новый подкласс для каждого нового типа.


@ Grzenio Да, это точно ответило на мой вопрос. Конечно, теперь мне нужно продублировать весь общий интерфейс, но это не большая проблема. Я должен был подумать об этом ...

@ Ака Вы правы насчет печати утки. Я не ожидал бы, что два совершенно случайных типа объектов будут доступны.

Но я думал, что универсальные объекты будут иметь какой-то общий интерфейс, поскольку они абсолютно одинаковы, за исключением типа, которым они параметризуются. По-видимому, это не так автоматически.

Ответы [ 3 ]

7 голосов
/ 09 сентября 2008

Я не думаю, что это возможно в C #, потому что MyObject не является базовым классом MyObject. Обычно я определяю интерфейс («обычный», а не общий) и заставляю MyObject реализовывать этот интерфейс, например

interface INamedObject
{
    string Name {get;}
}

и тогда вы можете использовать интерфейс:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

Он ответил на ваш вопрос?

3 голосов
/ 09 сентября 2008

C # не поддерживает утку. У вас есть 2 варианта: интерфейсы и наследование, иначе вы не сможете получить доступ к аналогичным свойствам различных типов объектов.

0 голосов
/ 09 сентября 2008

Лучше всего добавить общий базовый класс, иначе вы можете вернуться к отражению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...