我将如何在C#中功能性地重新实现(或接近重新实现)泛型?

时间:2016-12-07 17:01:12

标签: c# generics inheritance

我希望能够在继承层次结构中编写一系列类。每个类必须有一个特定于该类的类型T的成员Foo。如果它是相关的,则此层次结构中的任何类都不会包含重复的Foo类。

我最初的想法是用泛型做到这一点。例如,

public class ExampleBase<T> where T: GenericType
{
    public T Foo
    {
        get;
        set;
    }
}

public class ExampleChildOne<T> : ExampleBase<T> where T : GenericTypeTwo {}

public class ExampleChildLeaf : ExampleChildOne<GenericTypeLeaf> {}

public class GenericType {}

public class GenericTypeTwo : GenericType {}

public class GenericTypeLeaf : GenericTypeTwo {}

使用此代码,我可以编写var foo = new ExampleChildLeaf().Foo;之类的内容。变量是我想要的类型,即GenericTypeLeaf。这很好。但是,我无法执行ExampleBase example = new ExampleChildLeaf();之类的操作,因为ExampleBase需要通用类型。我也无法ExampleBase<GenericType> example = new ExampleChildLeaf();,因为ExampleChildLeaf实际上并未延伸ExampleBase<GenericType>

我也尝试过一种非通用的方法来做到这一点。每个类都有自己的Foo,它具有正确的类型(因此一个将具有GenericType Foo,一个将具有GenericTypeLeaf Foo等)。这个问题是我不能用不同的一个覆盖一个Foo,因为类型不同。

因此。总而言之,我有什么方法可以在功能上做类似的事情吗?没关系,如果它有点复杂,因为这将是一个几乎不应该修改的库。我的目标是让最终用户在抽象出所有通用参数时轻松使用。

另外,我无法想出一个很好的方式来表达标题问题。我也很感激这方面的建议。谢谢!

1 个答案:

答案 0 :(得分:1)

如果您需要ExampleBase example = new ExampleChildLeaf();,可以通过创建一个不了解Foo的非通用基类来实现,但仍可以使用其他功能(假设还有其他功能) )。这与TaskTask<T>的工作方式非常相似。

public class ExampleBase
{
    //....
}

public class ExampleBase<T> : ExampleBase where T: GenericType
{
    public T Foo
    {
        get;
        set;
    }
}