Доступ к неуниверсальным членам универсального объекта
Вопрос
Есть ли способ собрать (например.в списке) несколько «универсальных» объектов, которые не имеют общего суперкласса?Если да, то как я могу получить доступ к их общим свойствам?
Например:
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 варианта:интерфейсы и наследование, иначе вы не сможете получить доступ к одинаковым свойствам объектов разных типов.
Лучшим способом было бы добавить общий базовый класс, иначе вы можете вернуться к отражению.