我们的程序有一个类型字典:
Dictionary<TKey, TCache>();
其中TKey和TCache是包含方法的泛型类型,而TCache是CacheBase。
在另一种方法中,我需要引用这个对象(它存储在另一个字典中,它存储为一个对象)并从中删除一个键/值对。在运行时,我将TKey对象装箱为“对象”类。
我该怎么做?我无法转换为Dictionary,因为此方法不是通用的,并且在编译时不会知道它是什么类型的缓存/键。这些作为参数传递。
有没有办法使用反射将字典从Dictionary转换为有效
Dictionary<CacheBase<key.GetType()>, key.GetType()>
我知道这可以很容易地通过不使用泛型方法来修复,而是使Dictionary成为一个字典并使CaseBase扩展一个空的CacheBase,但我的主管坚持我这样做
答案 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 } );
这让我与一个在运行时装入对象的字典进行通信,只有类型可用。