3

如果存在,以下 Java 代码的 C# 等价物是什么:

new HashMap<Class<? extends BaseClass>, Integer>();

我目前使用new Dictionary<Type, int>()的,这更像是
new HashMap<Class<?>, Integer>()哪个,显然不一样。

HashMap(忽略和之间的差异Dictionary

编辑:为了澄清,我不是想定义一个新类,只是创建一个HashMap/的实例Dictionary

4

3 回答 3

3

我相信您想将类型参数限制为泛型类型 - where关键字用于:

class MyDict<TKey, TValue> : Dictionary<TKey, TValue> where TValue : SomeBaseClass
{
    ...
}

这是你要问的还是我误解了你的问题?

编辑:你不能完全按照你在 C# 中的要求去做——你不能用类型约束定义泛型类型的本地实例。但是,您可以预先声明您的约束Dictionary类型(如我的示例),然后创建该类型的实例,如下所示:

// SomeClass will have to inherit from SomeBaseClass
MyDict<SomeClass> instance = new MyDict<SomeClass> ();

认为这与您正在寻找的内容很接近。如果我误解了,请发表评论 - 我对 Java 的了解并不深。

于 2012-10-12T19:21:59.187 回答
3

C# 中没有等效的 Java 通配符。在 Java 中,类型的类型是类本身的Class<T>位置。TC# 中的等价物是类型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);
    }
}

(也实现Equalsand GetHashCode,只是委托给Type。)

然后你的字典变成:

var d = new Dictionary<TypeWrapper<BaseClass>, int>();
d.Add(typeof(BaseClass), 2);
d.Add(typeof(Child), 3);
于 2012-10-12T19:32:27.010 回答
0

正在研究同样的问题,这个穷人的检查器是我能想到的最好的东西:

class MyValue {
    public Type Type { get; private set; }

    private MyValue(Type type)
    {
        this.Type = type;
    }

    public MyValue of<T>() where T : BaseClass
    {
        return new MyValue(typeof(T));
    }
}

IDictionary<int, MyValue> myDictionary = new Dictionary<int, MyValue>()
{
    { 1, MyValue.of<SubClass1>(); },
    { 2, MyValue.of<SubClass2>(); },
    { 3, MyValue.of<NotSubClass>(); }, // this causes a compile error
};
于 2014-10-28T03:47:58.320 回答