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

本文关键字:转换 基类 泛型类 派生 | 更新日期: 2023-09-27 17:59:55

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

Class A 
{
    public int data;
}
Class B : Class A { }
Class C : Class A { }
Class D : Class A { }
.
.
.
Class G<T> 
{
    T field
}
main()
{
    object t = CallOuterService();
}

假设t是用其中一个派生类实例化的G的实例,有没有一种方法可以访问数据字段而不尝试强制转换到所有派生类?

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

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

通过协方差,您可以:

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属性)