繁体   English   中英

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

[英]casting a base generic class from a derived generic class in C#

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

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 不是由我的代码处理的,它们都是与外部服务的接口。 我无法以任何方式编辑它们...

通过协方差,您可以:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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