首页 文章

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

提问于
浏览
-1

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

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

1 回答

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

相关问题