是否有可能投一个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>
。
有没有办法做到这一点? 或者我应该找出一种不同的方式来处理这些字典?
任何帮助将不胜感激。
继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鸭打字是在这种情况下派上用场。
这是帮你?
Dictionary<a, b> output =
input.ToDictionary(item => item.Key, item => (SomeType)item.Value);
即使你能找到一些方式来表达这一点,那将是错误的做法-这是不正确的,一个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的答案的确 )
考虑是铸造和object
确实是必要的。 我开始沿着这条道路和整个本文迷迷糊糊中,我实现能达到我需要的东西,通过仿制药,而不是转换之前。 例如;
class DictionaryUtils<T>
{
public static T ValueOrDefault(IDictionary<string, T> dictionary, string key)
{
return dictionary.ContainsKey(key) ? dictionary[key] : default(T);
}
}
的码,该位是更清洁,将比在其他的答案所示的等效转换代码更快。
是的,它可以将投FieldInfo
,以Dictionary
如下
这是一个例子,我在我的代码中使用
Dictionary<string, string>
GetTheDict = FilesAndPaths.GetType()
.GetFields()
.Where(f => f.Name.Equals(pLoadFile))
.Select(f => (Dictionary<string, string>)f.GetValue(FilesAndPaths))
.Single();