在泛型派生的类集合中使用泛型基类

时间:2015-01-23 13:28:13

标签: c# generics dictionary abstract-class

我从Java进入C#,我无法找到解决以下问题的方法:

我有一个通用的基类:

class MyBase<T>  where T : SomeAncestorOfTs
{ ... }

然后从中派生出一些专门的类(ABC ...),例如:

class A : MyBase<SomeSpecificT> 
{ ... }

现在在我的代码中的某个地方,我想创建Dictionary MyBase的各种后代的Dictionary<string,MyBase<>>:类似于Dictionary<String,Object>,但这不起作用。

除了做HashMap<String,MyBase<? extends SomeAncestorOfTs>>之外,C#中有没有办法?

在Java中,这可以通过T轻松实现。

更新SomeAncestorOfT应该有一个公共基类({{1}})。

5 个答案:

答案 0 :(得分:4)

不能直接这样做。我的建议是添加另一个非泛型的基类:

class MyBase
{ ... }

class MyBase<T> : MyBase
{ ... }

然后制作该基地的字典:Dictionary<string,MyBase>

答案 1 :(得分:2)

这样的事情怎么样:

public class SuperBase
{
}

internal class MyBase<T> : SuperBase
{
}


internal class A : MyBase<string>
{
    public void DoStuff()
    {
        Dictionary<string, SuperBase> _dict = new Dictionary<string, SuperBase>();

        _dict.Add("first", new MyBase<int>());
        _dict.Add("second", new MyBase<object>());
        _dict.Add("third", new MyBase<string>());
    }
}

这至少不会产生编译错误(尽管我不能保证它不会产生其他无法预料的头痛)。

答案 2 :(得分:1)

简短的回答是没有你不能在C#中做到这一点。 MyBase<int>MyBase<string>不共享object以外的基类。就个人而言,即使它在语法上有效,我也看不出我会用它做什么。

如果所有这些实例共享一个行为,那么让它们全部实现该接口并拥有这些接口的字典。

答案 3 :(得分:0)

这似乎工作正常,对你有帮助吗?

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, MyBase> dic = new Dictionary<string, MyBase>();
        A<int> test= new A<int>();

        dic.Add("test", test);
    }
}
class MyBase
{ }
class A<T> : MyBase
{}

答案 4 :(得分:0)

class MyBase<T>
{ ... }

class A : MyBase<SomeSpecificT> 
{ ... }

如果您不想使用Object,则可以使用dynamic。

var dict = new Dictionary<String, MyBase<dynamic>>();