我从Java进入C#,我无法找到解决以下问题的方法:
我有一个通用的基类:
class MyBase<T> where T : SomeAncestorOfTs
{ ... }
然后从中派生出一些专门的类(A
,B
,C
...),例如:
class A : MyBase<SomeSpecificT>
{ ... }
现在在我的代码中的某个地方,我想创建Dictionary
MyBase
的各种后代的Dictionary<string,MyBase<>>
:类似于Dictionary<String,Object>
,但这不起作用。
除了做HashMap<String,MyBase<? extends SomeAncestorOfTs>>
之外,C#中有没有办法?
在Java中,这可以通过T
轻松实现。
更新:SomeAncestorOfT
应该有一个公共基类({{1}})。
答案 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>>();