C# 中没有等效的 Java 通配符。在 Java 中,类型的类型是类本身的Class<T>
位置。T
C# 中的等价物是类型Type
,它不是通用的。所以似乎你能做的最好的事情就是拥有,如你所说, a Dictionary<Type, int>
,如果它被封装在一个类中,你可以限制你在代码中放入字典中的内容(所以它只是一个运行时检查):
private Dictionary<Type, int> myDictionary = new Dictionary<Type, int>();
public void Add(Type type, int number) {
if (!typeof(BaseClass).IsAssignableFrom(type)) throw new Exception();
myDictionary.Add(type, number);
}
您甚至可以IDictionary
使用该逻辑实现您自己的。
更新
我能想到的另一个运行时技巧是为您的类型使用包装类:
public class TypeWrapper<T>
{
public Type Type { get; private set; }
public TypeWrapper(Type t)
{
if (!typeof(T).IsAssignableFrom(t)) throw new Exception();
Type = t;
}
public static implicit operator TypeWrapper<T>(Type t) {
return new TypeWrapper<T>(t);
}
}
(也实现Equals
and GetHashCode
,只是委托给Type
。)
然后你的字典变成:
var d = new Dictionary<TypeWrapper<BaseClass>, int>();
d.Add(typeof(BaseClass), 2);
d.Add(typeof(Child), 3);