2017-06-07 40 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 }); 

这让我可以与在运行时装入对象的字典进行通信,只有可用的类型。