2012-04-15 63 views
0

我有場+的屬性類型T,我想從字典來填充,PREF不區分大小寫反射循環的任何LINQ替代?

我可以明明

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

然後

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

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

+5

'...'下面是什麼? – abatishchev 2012-04-15 16:18:02

+0

字典從哪裏來?考慮完全跳過字典並使用序列化。 – 2012-04-15 16:22:22

+0

我相信任務是將字典轉換爲一個類型爲「T」的實例,從字典中填充其成員。 – 2012-04-15 16:23:53

回答

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

...雖然不知道它讓太多意義,因爲通過去無論如何,屬性/字段是相對簡單的,也許是一個想法。

+0

避免幫助類包裝「PropertyInfo」和「FieldInfo」的不同API的有趣方法。雖然有點怪異。 :) – 2012-04-15 16:54:09

+0

我沒有說它不是'可怕的':)只是在編譯的時候浪費時間。 OP要LINQ,所以它就是這樣 – NSGaga 2012-04-15 16:56:06

0

取決於您打算如何處理pi

  • 如果轉換到一些新的類,然後你可以

    t.GetProperties().Select(pi => 
    t.GetFields().Select(pi => 
    
  • 如果讀取性能和輸出它們,然後foreach環比LINQ更好。

1

我不認爲還有什麼更好的。 PropertyInfoFieldInfo類型具有用於設置值的不同API,因此即使將它們收集到IEnumerable<MemberInfo>中,也不能以統一的方式填充它們的值。

那麼,你可以編寫一個封裝器,以封裝不同API的統一方式處理PropertyInfoFieldInfo。但無論如何,更容易循環。