在派生类中设置泛型类型属性

时间:2016-06-15 20:37:21

标签: c# generics

我有一个泛型G<T> where T : A,其中A是一个抽象类。在从B派生的每个类A中,我想要一个类型为G<B>的字段,而不是编写重复代码,但是我不确定它是否可能。一种方法是

abstract class A
{
    protected object g;

    protected abstract void SetG();

    public A()
    {
        SetG();
    }
}

class B : A
{
    protected override void SetG()
    {
        this.g = new G<B>();
    }

    public B() : base() {}
}

但这意味着每个派生类中都会有很多重复代码。有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

您可以在其间添加一个额外的抽象类:

public abstract class A<T> : A where T : A
{
    protected override void SetG()
    {
        this.g = new G<T>();
    }
}

...然后,将您的B声明更新为:

public class B : A<B>
{
    public B() : base() { }
}

答案 1 :(得分:0)

我相信你要做的是Covariant Conversion。有关使用委托的信息,请参阅此MSDN article,看看它是否适合您。请查看&#34;使用具有协变类型参数的代理&#34;。

在你的A:中,创建一个委托:

Func<G<A>> GetG;

然后,在派生类中,将此func指针设置为类型

的函数
Func<G<B>>

宾果!