C# 反射中的循环是否有LINQ替代方案?
我有一个类型T,它包含我想从字典中填充的字段+属性,pref不区分大小写 我当然可以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
foreach(PropertyInfo pi in t.GetProperties() )
.....
然后
foreach(FieldInfo pi in t.GetFields() )
.....
希望有更好的方法,也许使用LINQ?取决于您打算如何使用
pi
- 如果转换到某个新类,则可以
t.GetProperties().Select(pi => t.GetFields().Select(pi =>
- 如果读取属性并输出它们,那么
loop比LINQ更好foreach
pi
- 如果转换到某个新类,则可以
t.GetProperties().Select(pi => t.GetFields().Select(pi =>
- 如果读取属性并输出它们,那么
loop比LINQ更好foreach
- 我认为没有比这更好的了
PropertyInfo
和FieldInfo
类型具有不同的设置值的API,因此即使将它们收集到IEnumerable
中,也无法以统一的方式填充它们的值
您可以编写一个包装器,以统一的方式处理
PropertyInfo
和FieldInfo
,封装不同的API。但是2foreach
循环无论如何都更容易。我认为没有更好的了PropertyInfo
和FieldInfo
类型具有不同的设置值的API,因此即使将它们收集到IEnumerable
中,也无法以统一的方式填充它们的值
您可以编写一个包装器,以统一的方式处理PropertyInfo
和FieldInfo
,封装不同的API。但是2foreach
循环无论如何都比较容易。这里有一个选项
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,就这样