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>
而且你不会遇到任何麻烦.
归档时间: |
|
查看次数: |
219 次 |
最近记录: |