2011-12-02 67 views
2

這裏是我的代碼:GetFields和GetProperties類型的循環?

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); 
foreach (FieldInfo field in fields) 
{ 
    //some code 
} 

var props = type.GetProperties(); 
foreach (PropertyInfo prop in props) 
{ 
    //exact same code 
} 

我知道我可以創建一個我可以叫兩次,但想什麼,我做的(如果可能的話)是單foreach的功能。像這樣的事情(是的,代碼不能正常工作。如果它的工作,我不會問這個問題。!):

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); 
var props = type.GetProperties(); 

foreach (PropertyInfo prop in fields && PropertyInfo prop in props) 
{ 
    //some code 
} 

我真的覺得有一種方法,即使我知道我的解決辦法遠遠不是編譯:(
感謝您的幫助!

回答

3

如果你通過的MemberInfo類公開的屬性確定(這是兩個字段信息和的PropertyInfo基地),那麼你可以做到以下幾點:

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance).Cast<MemberInfo>(); 
var props = type.GetProperties().Cast<MemberInfo>(); 
var fieldsAndProperties = fields.Union(props); 

foreach (MemberInfo mi in fieldsAndProperties) 
{ 
... 
} 
1

如果MemberInfo展示的功能足以滿足你的循環,那麼你可以連接在同一個陣列或者其他枚舉兩個字段和屬性並重復一次

這是可能的,因爲FieldInfoPropertyInfo繼承自MemberInfo類。

示例代碼:

var fields = typeof(DateTime).GetFields(
    BindingFlags.Public | BindingFlags.Instance); 

var properties = typeof(DateTime).GetProperties(
    BindingFlags.Public | BindingFlags.Instance); 

var all = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()); 

foreach (MemberInfo mi in all) 
{ 
    //some code 
} 
1

要把它們放到一個循環中:

foreach (MemberInfo member in fields.Cast<MemberInfo>().Concat(props)) 
{ 
    //I'm 100% sure this isn't what you want 
    //because you need to set value here 
    //in this case, you still need to check if member is a FieldInfo/PropertyInfo 
    //and then convert it before you set the values 
} 

實際上,在這裏使用兩個循環可能會更好。首先,代碼看起來更清晰,因爲它們做着不同的事情,一個設置字段值,另一個設置屬性值。其次,註冊緩存可能有助於使你的程序比一個循環快一點。

+0

Nop,我只會從字段/屬性中獲取(閱讀)信息!應該這樣工作,我會嘗試 –

0

嗯......

這種迭代是放鬆字段和屬性的順序。 例如

class Test 
{ 
    public String tests { get; set; } 
    public int testi; 
} 

如果GetFields如果得到第一 - 我們得到「TESTI」作爲第一memberm並通過GetProperies我們得到的「測試」。 聯盟可能會合並它們,但訂單不會保留。

有沒有辦法獲得字段和屬性並保持它們的順序?