C# 反射中的循环是否有LINQ替代方案?

C# 反射中的循环是否有LINQ替代方案?,c#,.net,linq,typedescriptor,C#,.net,Linq,Typedescriptor,我有一个类型T,它包含我想从字典中填充的字段+属性,pref不区分大小写 我当然可以 foreach(PropertyInfo pi in t.GetProperties() ) ..... 然后 foreach(FieldInfo pi in t.GetFields() ) ..... 希望有更好的方法,也许使用LINQ?取决于您打算如何使用pi 如果转换到某个新类,则可以 t.GetProperties().Select(pi => t.GetFields().Select(pi

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

我当然可以

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

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

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

取决于您打算如何使用
pi

  • 如果转换到某个新类,则可以

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


取决于您计划如何使用
pi

  • 如果转换到某个新类,则可以

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


    • 我认为没有比这更好的了
      PropertyInfo
      FieldInfo
      类型具有不同的设置值的API,因此即使将它们收集到
      IEnumerable
      中,也无法以统一的方式填充它们的值


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

      我认为没有更好的了
      PropertyInfo
      FieldInfo
      类型具有不同的设置值的API,因此即使将它们收集到
      IEnumerable
      中,也无法以统一的方式填充它们的值

      您可以编写一个包装器,以统一的方式处理
      PropertyInfo
      FieldInfo
      ,封装不同的API。但是2
      foreach
      循环无论如何都比较容易。

      这里有一个选项

      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);
      
      var propDict=t.GetProperties().ToLookup(
      p=>p.Name,p=>(obj,val)=>p.SetValue(obj,val,null));
      var fieldDict=t.GetFields().ToLookup(
      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);
      
      字典输出;
      foreach(输出中的var keyval)
      memberDict[keyval.Key](容器,keyval.Value);
      
      …尽管不确定它是否有太多意义,因为遍历属性/字段是相对简单的,但可能有一个想法。

      这里有一个选项

      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);
      
      var propDict=t.GetProperties().ToLookup(
      p=>p.Name,p=>(obj,val)=>p.SetValue(obj,val,null));
      var fieldDict=t.GetFields().ToLookup(
      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);
      
      字典输出;
      foreach(输出中的var keyval)
      memberDict[keyval.Key](容器,keyval.Value);
      

      …尽管不确定它是否有太多意义,因为遍历属性/字段是相对简单的,但可能有一个想法。

      字典是从哪里来的?考虑完全跳过字典,使用序列化。我认为任务是把字典转换成一个类型:<代码> t>代码>从字典中填充它的成员。字典是从哪里来的?考虑完全跳过字典并使用序列化。我认为任务是将字典转换成类型<代码> t>代码>,从字典中填充它的成员。一个有趣的方法来避免帮助类包装不同API的<代码> PrimeType < /代码>和<代码> FieldInfo < /代码>。不过有点可怕。:)我并没有说它不是‘怪物’:)只是在编译时消磨时间。OP需要LINQ,因此它是一种有趣的方法,可以避免使用helper类包装
      PropertyInfo
      FieldInfo
      的不同API。不过有点可怕。:)我并没有说它不是‘怪物’:)只是在编译时消磨时间。OP想要LINQ,就这样