【问题标题】:Accessing non-generic members of a generic object访问泛型对象的非泛型成员
【发布时间】:2008-09-09 10:56:45
【问题描述】:

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

例如:

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# .net generics


    【解决方案1】:

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

    它回答了你的问题吗?

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        最好的方法是添加一个通用的基类,否则你可以回退到反射。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          相关资源
          最近更新 更多