题
有没有办法收集(例如在列表中)多个不共享公共超类的“通用”对象?如果是这样,我如何访问它们的共同属性?
例如:
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个选择:接口和继承,否则无法访问不同类型对象的相似属性。
最好的方法是添加一个公共基类,否则您可以回退到反射。
不隶属于 StackOverflow