C#将Dictionary <string,AnyType>转换为Dictionary <string,Object>(涉及反射)

Rya*_*van 9 c# reflection casting

是否可以将a Dictionary<string, Anything>转换为一致的中间泛型类型?所以,我将能够施展<string, string>,<string, bool>,<string, int>,<string, anything>所有同类型的字典吗?

我正在研究一个使用大量反射的项目,我需要能够处理DIctionary类型:

FieldInfo field = this.GetType().GetField(fieldName);
Dictionary<string, Object> dict = (Dictionary<string, Object>)field.GetValue(this);
Run Code Online (Sandbox Code Playgroud)

上面的代码是我目前所拥有的,并且程序始终在从field.GetValue到通用的转换中失败Dictionary<string, Object>.

有没有办法做到这一点?或者我应该找出一种不同的方式来处理这些词典?

任何帮助将不胜感激.

Gib*_*nag 11

按照AakashM的回答,Cast似乎没有打球.你可以通过使用一个小帮助方法解决它:

IDictionary dictionary = (IDictionary)field.GetValue(this);
Dictionary<string, object> newDictionary = CastDict(dictionary)
                                           .ToDictionary(entry => (string)entry.Key,
                                                         entry => entry.Value);

private IEnumerable<DictionaryEntry> CastDict(IDictionary dictionary)
{
    foreach (DictionaryEntry entry in dictionary)
    {
        yield return entry;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在foreach中输入的鸭子很方便.

  • 不需要特殊的CastDict方法,只需使用普通的Cast <DictionaryEntry>()LINQ运算符即可. (2认同)

Roy*_*mir 9

这对你有帮助吗?

Dictionary<a, b> output =
   input.ToDictionary(item => item.Key, item => (SomeType)item.Value);
Run Code Online (Sandbox Code Playgroud)


Aak*_*shM 8

即使你能找到某种表达方式,这也是错误的做法 - a Dictionary<string, bool> 不是 a Dictionary<string, object>,所以我们绝对不想.考虑一下,如果我们可以投射,我们可以尝试将一个stringin作为一个值,这显然是不合适的!

然而,我们可以做的是强制转换为非泛型IDictionary(所有Dictionary<,>的实现),然后使用它来构造具有相同值的new Dictionary<string, object>:

FieldInfo field = this.GetType().GetField(fieldName);
IDictionary dictionary = (IDictionary)field.GetValue(this);
Dictionary<string, object> newDictionary = 
    dictionary
    .Cast<dynamic>()
    .ToDictionary(entry => (string)entry.Key,
                  entry => entry.Value);
Run Code Online (Sandbox Code Playgroud)

(请注意,由于这里讨论的原因你不能.Cast<DictionaryEntry>这里使用.如果你是C#4之前,所以没有dynamic,你必须手动进行枚举,正如Gibsnag的回答所做的那样)