繁体   English   中英

如何找出一个类是否是C#中通用接口的实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM