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);
}
}
( と も実装Equals
しGetHashCode
、 に委譲するだけType
です。)
そして、辞書は次のようになります。
var d = new Dictionary<TypeWrapper<BaseClass>, int>();
d.Add(typeof(BaseClass), 2);
d.Add(typeof(Child), 3);