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

C# には Java ワイルドカードに相当するものはありません。Java では、型の型はClass<T>クラスT自体です。C# でこれに相当するのは typeTypeで、これは generic ではありません。したがって、あなたが言ったように、あなたができる最善のことは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そのロジックを使用して独自に実装することもできます。

アップデート

私が考えることができるもう 1 つのランタイムトリックは、型にラッパー クラスを使用することです。

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);
    }
}

( と も実装EqualsGetHashCode、 に委譲するだけTypeです。)

そして、辞書は次のようになります。

var d = new Dictionary<TypeWrapper<BaseClass>, int>();
d.Add(typeof(BaseClass), 2);
d.Add(typeof(Child), 3);
于 2012-10-12T19:32:27.010 に答える
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 に答える
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 に答える