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

C# 访问泛型对象的非泛型成员,c#,.net,generics,C#,.net,Generics,是否有方法收集(例如在列表中)多个不共享公共超类的“泛型”对象?如果是,我如何访问它们的公共属性 例如: 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

是否有方法收集(例如在列表中)多个不共享公共超类的“泛型”对象?如果是,我如何访问它们的公共属性

例如:

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);
类MyObject
{
公共T值{get;set;}
公共字符串名称{get;set;}
公共MyObject(字符串名称,T值)
{
名称=名称;
价值=价值;
}
}
var fst=新的MyObject(“fst”,42);
var snd=新的MyObject(“snd”,真);
列表>(){fst,snd};
foreach(列表中的MyObject o)
控制台写入线(o.Name);
显然,这是伪代码,不起作用

另外,我不需要访问.Value属性(因为那不是类型安全的)

编辑:现在我已经考虑过这个问题,可以使用子类来完成这个任务。然而,我认为这意味着我必须为每个新类型编写一个新的子类


@ 是的,这正好回答了我的问题。当然,现在我需要复制整个共享接口,但这不是什么大问题。我应该想到的

@ 关于鸭子打字,你是对的。我不希望有两种完全随机的对象可以访问


但我认为泛型对象将共享某种公共接口,因为它们除了参数化的类型之外完全相同。显然,这种情况并非自动发生。

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

我认为在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);
List List=newlist(){fst,snd};
foreach(列表中的INAMEDO对象)
控制台写入线(o.Name);

它回答了您的问题吗?

最好的方法是添加一个公共基类,否则您可以返回到反射