访问通用对象的非通用成员
时间: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);
它回答了问题吗?
回答
最好的方法是添加一个通用的基类,否则我们可能会倒退反思。