从C#中的派生泛型类转换基类泛型类

时间:2015-06-25 13:58:02

标签: c# generics

我需要找到一种从泛型类的实例中检索属性的方法,其中泛型参数类型是派生类。 例如:

Deepest pit at index 7 == 3

假设t是使用其中一个派生类实例化的G实例,有没有办法访问数据字段而不尝试转换为所有派生类?

*已编辑 - 1.数据字段是公开的 2.类A,B,C ... G不是由我的代码处理的,它们都是与外部服务的接口。我无法以任何方式编辑它们......

1 个答案:

答案 0 :(得分:1)

通过covariance你可以:

class A
{
    public int data;
}

class B : A { }

class C : A { }

class D : A { }

interface IG<out T>
{
    T field { get; }
}

class G<T> : IG<T>
{
    public T field { get; set; }
}

然后:

G<D> gd = new G<D> { field = new D { data = 5 } };

IG<A> ga = gd;
int data = ga.field.data; // 5

请注意,您只能阅读field属性,而不能写出来!并且协方差仅适用于接口(因此我必须定义IG<T>接口并使用它来访问field属性)