我有場+的屬性類型T,我想從字典來填充,PREF不區分大小寫反射循環的任何LINQ替代?
我可以明明
foreach(PropertyInfo pi in t.GetProperties())
.....
然後
foreach(FieldInfo pi in t.GetFields())
.....
希望能有更好的方法,也許使用LINQ?
我有場+的屬性類型T,我想從字典來填充,PREF不區分大小寫反射循環的任何LINQ替代?
我可以明明
foreach(PropertyInfo pi in t.GetProperties())
.....
然後
foreach(FieldInfo pi in t.GetFields())
.....
希望能有更好的方法,也許使用LINQ?
這裏是一個選項,
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);
...雖然不知道它讓太多意義,因爲通過去無論如何,屬性/字段是相對簡單的,也許是一個想法。
避免幫助類包裝「PropertyInfo」和「FieldInfo」的不同API的有趣方法。雖然有點怪異。 :) – 2012-04-15 16:54:09
我沒有說它不是'可怕的':)只是在編譯的時候浪費時間。 OP要LINQ,所以它就是這樣 – NSGaga 2012-04-15 16:56:06
取決於您打算如何處理pi
。
如果轉換到一些新的類,然後你可以
t.GetProperties().Select(pi =>
t.GetFields().Select(pi =>
如果讀取性能和輸出它們,然後foreach
環比LINQ更好。
我不認爲還有什麼更好的。 PropertyInfo
和FieldInfo
類型具有用於設置值的不同API,因此即使將它們收集到IEnumerable<MemberInfo>
中,也不能以統一的方式填充它們的值。
那麼,你可以編寫一個封裝器,以封裝不同API的統一方式處理PropertyInfo
和FieldInfo
。但無論如何,更容易循環。
'...'下面是什麼? – abatishchev 2012-04-15 16:18:02
字典從哪裏來?考慮完全跳過字典並使用序列化。 – 2012-04-15 16:22:22
我相信任務是將字典轉換爲一個類型爲「T」的實例,從字典中填充其成員。 – 2012-04-15 16:23:53