如何确定类是否是 C# 中泛型接口的实例



那么是否有可能获得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类应该有一些实现,不管TProperty<T>派生自Property,有更多的实现与T相关。

最新更新