Доступ к неуниверсальным членам универсального объекта

StackOverflow https://stackoverflow.com/questions/51586

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Например:

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 (поскольку это небезопасно с точки зрения типов).

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


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

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

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

Это было полезно?

Решение

Я не думаю, что это возможно в 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);

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top