aum*_*ets 10 .net c# java generics covariance
在Java中,我可以使用通配符"?"指定泛型.可以像这样创建一个地图:
Map<String, ?>.
我正在使用C#,我需要一个Dictionary<String, SomeInterface<?>>(在哪里?可以是int,double,任何类型).这可能在C#中吗?
编辑:
例:
interface ISomeInterface<out T>{
T Method();
void methodII();
}
class ObjectI : ISomeInterface<int>{
...
}
class ObjectII : ISomeInterface<double>{
...
}
class ObjectIII : ISomeInterface<string>{
....
}
Run Code Online (Sandbox Code Playgroud)
我试图将这些对象映射到Dictionary中,如:
Dictionary<String, ISomeInterface<?>> _objs = new Dictionary<String, ISomeInterface<?>();
_objs.Add("Object1", new ObjectI());
_objs.Add("Object2", new ObjectII());
_objs.Add("Object3", new ObjectII());
foreach(var keyVal in _objs){
Console.WriteLine(keyVal.Method());
}
Run Code Online (Sandbox Code Playgroud)
使用Assembly和Activator.createInstance在运行时加载实现ISomeInterface的对象.在创建的那一刻,我不会,如果对象实现 ISomeInterface<int>或ISomeInterface<double>.
很感谢任何形式的帮助.
没有.
但是,如果您使用的是C#4,则可以进行ISomeInterface 协变,以便ISomeInterface<Anything>可以转换为ISomeInterface<object>.
如果ISomeInterface有方法接受其类型参数的参数(而不是返回值),这将是完全不可能的,因为它将允许您传递任意对象作为参数.
编辑:在您的特定情况下,最好的解决方案是使IMyInterface<T>继承成为一个单独的非泛型IMyInterface接口,并将所有不涉及的成员移动T到基接口.
然后你可以使用a Dictionary<string, IMyInterface>而且你不会遇到任何麻烦.