C# 如何在运行时将ConcurrentDictionary转换为Dictionary?
我知道如何将ConcurrentDictionary转换为Dictionary 我知道我可以使用反射来确定对象是否包含ConcurrentDictionary 但在我通过反射确定一个对象确实有一个ConcurrentDictionary之后,如何在运行时将其转换为一个Dictionary?或者我能做到吗?这将改变类的定义,对吗 编辑:我应该说得更清楚。我将展示一个示例:C# 如何在运行时将ConcurrentDictionary转换为Dictionary?,c#,C#,我知道如何将ConcurrentDictionary转换为Dictionary 我知道我可以使用反射来确定对象是否包含ConcurrentDictionary 但在我通过反射确定一个对象确实有一个ConcurrentDictionary之后,如何在运行时将其转换为一个Dictionary?或者我能做到吗?这将改变类的定义,对吗 编辑:我应该说得更清楚。我将展示一个示例: [Serializable] [DataContract] public class CacheIte
[Serializable]
[DataContract]
public class CacheItem
{
[DataMember]
private ConcurrentDictionary<string, CacheItemEntity> _cacheItemDictionary = new ConcurrentDictionary<string, CacheItemEntity>();
......
}
[可序列化]
[数据合同]
公共类缓存项
{
[数据成员]
私有ConcurrentDictionary_cacheItemDictionary=新ConcurrentDictionary();
......
}
当我序列化此类的实例时,AVRO无法序列化ConcurrentDictionary。因此,我想知道是否可以在运行时将ConcurrentDictionary转换为普通字典。这当然改变了类的定义。我只是想知道是否可以这样做。
ConcurrentDictionary
实现了IDictionary
,因此无论您在哪里尝试使用“dictionary”,都可以使用该接口。例如:
void ConsumeIDictionary(IDictionary dic)
{
//perform work on a dictionary, regardless of the concrete type
}
您可以这样调用该方法,这样就可以了:
ConsumeIDictionary(new ConcurrentDictionary<int,int>());
但是在这种情况下,您可能希望忘记泛型类型参数,只需检查IDictionary
接口:
bool IsDictionary(obj o)
{
return o is IDictionary;
}
想要转换类型的动机是什么?@jdpenix,能够通过microsoft AVRO库序列化包含ConcurrentDictionary的对象。
var newDictionary=yourConcurrentDictionary.ToDictionary(kvp=>vp.Key,kvp=>kvp.Value)代码>var字典=新字典(concurrentDictionary)代码>?您的问题令人困惑,因为您说过您知道如何执行A,并且您知道如何执行B,但您想知道如何执行B然后执行A。问题是您在编译时不知道类型参数,这是因为使用了反射吗?“更改类的定义”是什么意思?您是否试图更改字段本身的类型?如果你能把这说得更清楚,那真的很有帮助。。。
ConsumeDictionary(
new Dictionary(
new ConcurrentDictionary<int,int>()));
bool IsConcurrentDictionary<k, v>(obj o)
{
return o.GetType() == typeof(ConcurrentDictionary<k,v>);
}
bool IsDictionary(obj o)
{
return o is IDictionary;
}