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中输入的鸭子很方便.
这对你有帮助吗?
Dictionary<a, b> output =
input.ToDictionary(item => item.Key, item => (SomeType)item.Value);
Run Code Online (Sandbox Code Playgroud)
即使你能找到某种表达方式,这也是错误的做法 - 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的回答所做的那样)
| 归档时间: |
|
| 查看次数: |
29361 次 |
| 最近记录: |