那么是否有可能获得Property
Property<T>
的实例,并且不知道其泛型T
类型参数,调用其方法?
private interface Property<T>
{
T Value { get;}
void DestroyEarth();
}
class MyProperty : Property<int>
{
public int Value{ get { return 1 }; }
public void DestroyEarth() { }
}
所以我想知道我是否可以在通过以下方法收到的 MyProperty 实例上调用DestroyEarth()
void PropertyCaller(Property p){p.DestroyEarth();}
(注意:我们没有定义或有简单的Property
类或接口无处可去)
编辑:
对于问题编辑,我会说:声明一个非通用接口并移动与T
无关的方法,例如:
interface IProperty {
object Value { get;}
void DestroyEarth();
}
interface IProperty<T> : IProperty {
new T Value { get;}
}
class MyProperty : IProperty<int>
{
object IProperty.Value { get { return Value; } }
public int Value{get {return 1;} }
public void DestroyEarth(){}
}
当您不知道T
时,只需针对IProperty
编码.
(与发布代码之前不同的答案在历史记录中,供参考)
然后你有:
void PropertyCaller(IProperty p) { p.DestroyEarth(); }
当然,您也可以让编译器找出T
:
void PropertyCaller<T>(IProperty<T> p) { p.DestroyEarth(); }
您要求的是在您不知道 T 但仍想以某种方式调用该实例的情况下,Property<T>
类型之间的自动转换为 Property<object>
(我猜)。由于各种原因,这无法完成(研究泛型类型的"协方差/逆变"以对问题空间有一些见解)。
我建议自己进行此转换,并在具有相同签名但将 T 编写为对象的 Property<T>
类之上实现一个IProperty
(非通用 - 请参阅 Marc 的答案)接口。然后在需要时手动实现调用重定向到 T 方法。
你的Property
类应该有一些实现,不管T
,Property<T>
派生自Property
,有更多的实现与T
相关。