访问通用对象的非通用成员

时间:2020-03-05 18:49:58  来源:igfitidea点击:

有没有办法收集(例如在列表中)多个不共享公共超类的"通用"对象?如果是这样,我如何访问它们的共有属性?

例如:

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
我们对鸭子的打字是正确的。我不希望可以访问两种完全随机的对象类型。

但是我认为通用对象将共享某种通用接口,因为除了参数化的类型外,它们完全相同。显然,情况并非如此。

解决方案

回答

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);

它回答了问题吗?

回答

最好的方法是添加一个通用的基类,否则我们可能会倒退反思。