C# 如何在运行时将ConcurrentDictionary转换为Dictionary?

C# 如何在运行时将ConcurrentDictionary转换为Dictionary?,c#,C#,我知道如何将ConcurrentDictionary转换为Dictionary 我知道我可以使用反射来确定对象是否包含ConcurrentDictionary 但在我通过反射确定一个对象确实有一个ConcurrentDictionary之后,如何在运行时将其转换为一个Dictionary?或者我能做到吗?这将改变类的定义,对吗 编辑:我应该说得更清楚。我将展示一个示例: [Serializable] [DataContract] public class CacheIte

我知道如何将ConcurrentDictionary转换为Dictionary

我知道我可以使用反射来确定对象是否包含ConcurrentDictionary

但在我通过反射确定一个对象确实有一个ConcurrentDictionary之后,如何在运行时将其转换为一个Dictionary?或者我能做到吗?这将改变类的定义,对吗

编辑:我应该说得更清楚。我将展示一个示例:

    [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;
}