2012-10-12 38 views
3

如果它存在,什麼是C#相當於下面的Java代碼:的C#相當於Java的通配符

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

我目前使用new Dictionary<Type, int>(),這更像是
new HashMap<Class<?>, Integer>()這顯然是不一樣的。

(忽略HashMapDictionary之間的差異)

編輯:爲了澄清,我不是試圖定義一個新的類,只需創建的HashMap/Dictionary一個實例。

+1

可能重複的http://計算器。com/questions/4732494/cs-javas-equivalent-of-javas-extend-base-in-generics – halex

+0

@halex我看到了這個問題,它很相似 - 但它絕對不一樣。 – Acidic

回答

3

在C#中沒有等效的Java通配符。在Java中,類型的類型是Class<T>,其中T是類本身。在C#中的等效項是Type,其中不是通用的。所以看起來你所能做的最好的就是像你說的那樣擁有一個​​,如果它封裝在一個類中,你可以限制你在代碼中放入字典中的東西(所以它只是一個運行時檢查):

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

UPDATE

另一個運行招我能想到的是使用包裝類的類型:(還實現EqualsGetHashCode,只是委託給Type

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

然後你的字典變成:

var d = new Dictionary<TypeWrapper<BaseClass>, int>(); 
d.Add(typeof(BaseClass), 2); 
d.Add(typeof(Child), 3); 
+0

你幾乎擊中了頭部。我想要的是編譯時檢查,或者至少有運行時檢查,而不需要大量額外的代碼或創建新的類型。從答案看來,在C#中確實沒有這個相同的東西......這太遺憾了。 – Acidic

+0

這就是我所能看到的....我通常看不到很遠.... –

+0

....添加了另一個運行時選項 –

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。

+0

OP沒有聲明一個類...他試圖做的事是不可能在C# –

+0

@ThomasLevesque你似乎是正確的 - 編輯後,它似乎是一個函數調用。 – xxbbcc

+0

我想要做的是有一個''字典'與'類型'作爲關鍵,但不只是任何類型 - 只有'類型'從派生自某個基類的類。 – Acidic

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