【问题标题】:Any LINQ alternative for loop in reflection?反射中循环的任何 LINQ 替代方案?
【发布时间】:2012-04-27 04:01:08
【问题描述】:

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

我当然可以

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

然后

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

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

【问题讨论】:

  • 字典从何而来?考虑完全跳过字典并使用序列化。
  • 我相信任务是将字典转换为T 类型的实例,从字典中填充其成员。

标签: c# .net linq typedescriptor


【解决方案1】:

这是一个选项,

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

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

【讨论】:

  • 一种避免帮助类包装PropertyInfoFieldInfo 的不同API 的有趣方法。不过有点骇人听闻。 :)
  • 我并没有说它不是“可怕的”:) 只是在编译时消磨时间。 OP 想要 LINQ,所以它就在那里
【解决方案2】:

我认为没有比这更好的了。 PropertyInfoFieldInfo 类型有不同的 API 用于设置值,因此即使将它们收集到 IEnumerable&lt;MemberInfo&gt; 中,也无法以统一的方式填充它们的值。

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

【讨论】:

    【解决方案3】:

    取决于您打算如何处理 pi

    • 如果转换为一些新的类,那么你可以

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2011-10-14
      • 2015-07-30
      相关资源
      最近更新 更多