在Java中,我可以使用通配符“?”指定泛型。可以创建像这样的 map :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>{
....
}
我正在尝试将此对象映射到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());
}
使用Assembly和Activator.createInstance在运行时加载实现ISomeInterface的对象。在创建时,我不知道对象是否实现
ISomeInterface<int>
或ISomeInterface<double>
。很感谢任何形式的帮助。
最佳答案
不。
但是,如果您使用的是C#4,则可以将ISomeInterface
设置为covariant,以便ISomeInterface<Anything>
可转换为ISomeInterface<object>
。
如果ISomeInterface
具有使用其类型参数的参数(而不是返回值)的参数的方法,则这将是完全不可能的,因为这将允许您传递任意对象作为参数。
编辑:在您的特定情况下,最好的解决方案是使IMyInterface<T>
继承一个单独的非通用IMyInterface
接口(interface),并将所有不涉及T
的成员移至基本接口(interface)。
然后,您可以使用Dictionary<string, IMyInterface>
,不会有任何麻烦。