我有一个带有字段+属性的类型 T,我想从字典中填充它,不区分大小写
我显然可以
foreach(PropertyInfo pi in t.GetProperties() )
.....
接着
foreach(FieldInfo pi in t.GetFields() )
.....
希望有更好的方法,也许使用 LINQ ?
我有一个带有字段+属性的类型 T,我想从字典中填充它,不区分大小写
我显然可以
foreach(PropertyInfo pi in t.GetProperties() )
.....
接着
foreach(FieldInfo pi in t.GetFields() )
.....
希望有更好的方法,也许使用 LINQ ?
这是一个选项,
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);
...虽然不确定它是否有意义,因为无论如何通过属性/字段相对简单,但可能是一个想法。
我不认为有什么更好的。PropertyInfo
和FieldInfo
类型具有用于设置值的不同 API,因此即使将它们收集到IEnumerable<MemberInfo>
.
好吧,您可以编写一个包装器来处理这两种情况PropertyInfo
,并FieldInfo
以统一的方式封装不同的 API。但是foreach
无论如何,2个循环更容易。
取决于你打算做什么pi
。
如果转换为一些新课程,那么您可以
t.GetProperties().Select(pi =>
t.GetFields().Select(pi =>
如果读取属性并输出它们,那么foreach
循环比 LINQ 更好。