我有一个带有字段+属性的类型T,我想从字典填充,不区分大小写
我显然可以做到
foreach(PropertyInfo pi in t.GetProperties() )
.....
然后
foreach(FieldInfo pi in t.GetFields() )
.....
希望有更好的方法,也许使用LINQ?
答案 0 :(得分:2)
这是一个选项,
var propDict = t.GetProperties().ToLookup<PropertyInfo, string, Action<object, object>>(
p => p.Name, p => (obj, val) => p.SetValue(obj, val, null));
var fieldDict = t.GetFields().ToLookup<FieldInfo, string, Action<object, object>>(
f => f.Name, f => (obj, val) => f.SetValue(obj, val));
var memberDict = pDict.Concat(fDict).ToDictionary(p => p.Key, p => p.Value);
...然后使用像...这样的东西。
Dictionary<string, object> outDict;
foreach (var keyval in outDict)
memberDict[keyval.Key](container, keyval.Value);
...虽然不确定它是否有太多意义,因为无论如何通过属性/字段相对简单,也许是一个想法。
答案 1 :(得分:1)
我认为没有更好的东西。 PropertyInfo
和FieldInfo
类型具有不同的API用于设置值,因此即使您将它们收集到IEnumerable<MemberInfo>
中,您也无法以统一的方式填充它们。
好吧,您可以编写一个包装器,以统一的方式处理PropertyInfo
和FieldInfo
封装不同的API。但无论如何,2个foreach
循环更容易。
答案 2 :(得分:0)
取决于你打算用pi
做什么。
如果转换为某个新类,那么你可以
t.GetProperties().Select(pi =>
t.GetFields().Select(pi =>
如果读取属性并输出它们,那么foreach
循环优于LINQ。