0

我有一个带有字段+属性的类型 T,我想从字典中填充它,不区分大小写

我显然可以

foreach(PropertyInfo pi in t.GetProperties() )
.....

接着

foreach(FieldInfo pi in t.GetFields() )
.....

希望有更好的方法,也许使用 LINQ ?

4

3 回答 3

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

...虽然不确定它是否有意义,因为无论如何通过属性/字段相对简单,但可能是一个想法。

于 2012-04-15T16:46:37.973 回答
1

我不认为有什么更好的。PropertyInfoFieldInfo类型具有用于设置值的不同 API,因此即使将它们收集到IEnumerable<MemberInfo>.

好吧,您可以编写一个包装器来处理这两种情况PropertyInfo,并FieldInfo以统一的方式封装不同的 API。但是foreach无论如何,2个循环更容易。

于 2012-04-15T16:22:30.350 回答
0

取决于你打算做什么pi

  • 如果转换为一些新课程,那么您可以

    t.GetProperties().Select(pi =>
    t.GetFields().Select(pi =>
    
  • 如果读取属性并输出它们,那么foreach循环比 LINQ 更好。

于 2012-04-15T16:17:22.423 回答