访问泛型对象的非泛型成员

3

有没有一种方法可以收集(例如在列表中)多个不共享共同超类的“通用”对象?如果是这样,我如何访问它们的共同属性?

例如:

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 是的,那正好回答了我的问题。当然,现在我需要复制整个共享界面,但这不是一个大问题。我本应该想到这一点...

@aku 你关于鸭子类型的说法是正确的。我不会期望两种完全随机的对象可以被访问。

但我认为通用对象应该共享某种公共接口,因为它们完全相同,除了它们所参数化的类型。显然,这并不是自动的。

3个回答

7

我认为在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

C#不支持鸭子类型。你有两个选择:接口和继承,否则你无法访问不同类型对象的相似属性。


0
最好的方法是添加一个通用基类,否则您可以退而求其次使用反射。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接