C#铸词典 到词典 (涉及反射)(C# cast Dictionary t

2019-06-23 17:37发布

是否有可能投一个Dictionary<string, Anything>到一个一致的中间通用类型? 所以,我将能够施展<string, string><string, bool><string, int><string, anything>所有同类型的字典吗?

我的工作是使用重型反射一个项目,我需要能够处理词典类型,例如:

FieldInfo field = this.GetType().GetField(fieldName);
Dictionary<string, Object> dict = (Dictionary<string, Object>)field.GetValue(this);

上面的代码是什么,我现在已经和程序总是从field.GetValue投给通用失败Dictionary<string, Object>

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

任何帮助将不胜感激。

Answer 1:

继AakashM的回答中,演员似乎不打球。 您可以通过使用一个小帮手方法虽然绕过它:

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

中的foreach鸭打字是在这种情况下派上用场。



Answer 2:

这是帮你?

Dictionary<a, b> output =
   input.ToDictionary(item => item.Key, item => (SomeType)item.Value);


Answer 3:

即使你能找到一些方式来表达这一点,那将是错误的做法-这是不正确的,一个Dictionary<string, bool> 一个Dictionary<string, object> ,所以我们绝对不想 。 想想看,如果我们投中,我们可以尝试把一个string中的值,这显然不适合!

我们所能做的,但是,投给非泛型IDictionary (所有Dictionary<,>小号器),然后用它来建立一个新的 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);

(请注意,您不能使用.Cast<DictionaryEntry>这里这里讨论的原因 。如果你是前C#4,所以没有dynamic ,你必须手动进行枚举,作为Gibsnag的答案的确 )



Answer 4:

考虑是铸造和object确实是必要的。 我开始沿着这条道路和整个本文迷迷糊糊中,我实现能达到我需要的东西,通过仿制药,而不是转换之前。 例如;

class DictionaryUtils<T>
{
    public static T ValueOrDefault(IDictionary<string, T> dictionary, string key)
    {
        return dictionary.ContainsKey(key) ? dictionary[key] : default(T);
    }
}

的码,该位是更清洁,将比在其他的答案所示的等效转换代码更快。



Answer 5:

是的,它可以将投FieldInfo ,以Dictionary如下

这是一个例子,我在我的代码中使用

Dictionary<string, string> 
                GetTheDict = FilesAndPaths.GetType()
                             .GetFields()
                             .Where(f => f.Name.Equals(pLoadFile))
                             .Select(f => (Dictionary<string, string>)f.GetValue(FilesAndPaths))
                             .Single();


文章来源: C# cast Dictionary to Dictionary (Involving Reflection)