通过在运行时进行转换来访问通用字典

时间:2017-06-07 17:52:08

标签: c# dictionary reflection casting

我们的程序有一个类型字典:

Dictionary<TKey, TCache>();

其中TKey和TCache是​​包含方法的泛型类型,而TCache是​​CacheBase。

在另一种方法中,我需要引用这个对象(它存储在另一个字典中,它存储为一个对象)并从中删除一个键/值对。在运行时,我将TKey对象装箱为“对象”类。

我该怎么做?我无法转换为Dictionary,因为此方法不是通用的,并且在编译时不会知道它是什么类型的缓存/键。这些作为参数传递。

有没有办法使用反射将字典从Dictionary转换为有效

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

我知道这可以很容易地通过不使用泛型方法来修复,而是使Dictionary成为一个字典并使CaseBase扩展一个空的CacheBase,但我的主管坚持我这样做

1 个答案:

答案 0 :(得分:0)

管理我自己修复它,但对于未来的人,

基本上,我不得不翻开视角。我无法通过反射将现有字典转换为另一个等效类型,但目标是这样做,以便我可以在运行时使用类型修改字典。

所以相反,我制作了一个通用的方法,可以按照自己想要的方式与字典进行通信(如果它需要TKey,我让我的方法采用TKey,这样就能正常工作)。

e.g。

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

之后,我只是使用反射在运行时调用我的泛型方法,并将类型作为相应的泛型传入

e.g。

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

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