2008-09-09 46 views
2

有没有一种方法可以收集(例如在List中)多个不共享公共超类的“通用”对象?如果是这样,我怎样才能访问他们的共同属性?访问通用对象的非通用成员

例如:

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 你说得对鸭子打字。我不希望有两种完全随机的对象可以访问。

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

回答

6

我不认为这是可能的在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#不支持鸭子打字。你有2种选择:接口和继承,否则你不能访问不同类型对象的类似属性。

0

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