2017-06-07 37 views
-1

我們的節目有一個類型的詞典:通過鑄造訪問一個通用字典在運行時

Dictionary<TKey, TCache>(); 

其中TKEY的和TCache是​​任何泛型類型無所不包方法,並給出了TCache是​​CacheBase。

在另一種方法中,我需要引用該對象(該對象存儲在另一個字典中,作爲對象存儲),並從中刪除鍵/值對。在運行時,我將TKey對象裝扮成「對象」類。

我該怎麼辦?我不能轉換爲字典,因爲此方法不是通用的,並且在編譯時不知道它是什麼類型的緩存/密鑰。這些作爲參數傳遞。

是否有使用反射來投的字典從字典有效

Dictionary<CacheBase<key.GetType()>, key.GetType()> 

我知道這可以很容易地通過不使用方法仿製藥,而是使詞典字典,使案例庫擴展一個固定的方式空CacheBase,但我的上司執意要我做設法解決它在我自己的這種方式

+0

泛型編譯時間已解決。您無法在運行時使用反射來解析泛型類型。 –

+0

「CacheBase」是其他派生類型的接口嗎?你確定這個鍵是通用的嗎?還是它是'CacheBase'的一個屬性? –

+3

'字典'實現了一個非泛型接口'IDictionary'。也許你可以通過它來訪問它。但是一般來說,如果你沒有編譯時類型,那麼使用泛型只會造成比他們更值得的痛苦。 –

回答

0

,但對於未來的人,

從本質上講,我不得不翻轉的視角。我無法通過反射將現有字典轉換爲另一種等效類型,但目標是這樣做,因此我可以在運行時使用類型修改字典。

所以相反,我做了一個通用的方法,它會以所需的方式與字典進行通信(如果它期望一個TKey,我讓我的方法採用TKey,這樣它就可以正常工作)。

例如

public void RemoveFromCache<TCache, TKey>(Type type, TKeykey) where TCache : CacheBase<TKey> { 
    ((Dictionary<TKey, TCache>)m_caches[type]).Remove(key); 
} 

在那之後,我只是用反射來調用我的通用方法在用傳遞在作爲適當泛型

例如所述類型的運行時

var keyType = key.GetType(); 
var removeFromCache = GetType().GetMethod(nameof(RemoveFromCache)).MakeGenericMethod(type, keyType); 
removeFromCache.Invoke(this, new object[] { type, key }); 

這讓我可以與在運行時裝入對象的字典進行通信,只有可用的類型。