在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>{
....
}
我试图将这些对象映射到字典中,如:
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>
,我就不会这样做。
非常感谢任何帮助。
答案 0 :(得分:8)
没有
但是,如果您使用的是C#4,则可以ISomeInterface
covariant,以便ISomeInterface<Anything>
可以转换为ISomeInterface<object>
。
如果ISomeInterface
的方法接受其类型参数的参数(而不是返回值),那么这将是完全不可能的,因为它允许您将任意对象作为参数传递。
编辑:在您的具体情况下,最佳解决方案是让IMyInterface<T>
继承一个单独的非通用IMyInterface
界面,并移动所有不涉及T
的成员{1}}到基接口
然后,您可以使用Dictionary<string, IMyInterface>
,这样就不会有任何问题。
答案 1 :(得分:2)
可以将类型变量限制为某些类型:
public class Map<U, T> where T : IInterface
{
}
但是,您无法执行以下操作:
Map<string, T> map = new Map<string, T>()
答案 2 :(得分:2)
对于您所描述的用法,您可以使用IDictionary<string, ISomeInterface>
的解决方法:
interface ISomeInterface
{
object Method();
void Method2();
}
interface ISomeInterface<T> : ISomeInterface
{
T Method();
}
class C1 : ISomeInterface<int>
{
object ISomeInterface.Method() { return Method(); }
public int Method() { return 10; }
public void Method2() { }
}