反射循环的任何LINQ替代方案?

时间:2012-04-15 16:13:09

标签: c# .net linq typedescriptor

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

我显然可以做到

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

然后

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

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

3 个答案:

答案 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)

我认为没有更好的东西。 PropertyInfoFieldInfo类型具有不同的API用于设置值,因此即使您将它们收集到IEnumerable<MemberInfo>中,您也无法以统一的方式填充它们。

好吧,您可以编写一个包装器,以统一的方式处理PropertyInfoFieldInfo封装不同的API。但无论如何,2个foreach循环更容易。

答案 2 :(得分:0)

取决于你打算用pi做什么。

  • 如果转换为某个新类,那么你可以

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