[英]How to find out if a class is an instance of a generic interface in C#?
那么是否有可能获得Property<T>
为Property
的实例,并且不知道其通用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方法。
无论T
为何,您的Property
类都应具有一些实现,而Property<T>
从Property
派生的,更多实现与T
有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.