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





C# не поддерживает утиную печать. У вас есть 2 варианта: интерфейсы и наследование, иначе вы не сможете получить доступ к аналогичным свойствам разных типов объектов.
Я не думаю, что это возможно в 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);
Это ответило на ваш вопрос?
Лучшим способом было бы добавить общий базовый класс, иначе вы можете вернуться к отражению.