2010-08-02 68 views
28

我有這樣的代碼來遍歷一個對象,並通過反射得到其所有屬性:使用反射,我如何檢測具有setter的屬性。

foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var oldValue = propertyInfo.GetValue(oldVersion, null); 
} 

我怎樣才能做一個檢查,只能看着那些一個對他們的「設置」屬性? (我想忽略只讀值 - 只是 「獲取」)

+1

不要忘了與私有,保護,內部,或內部保護的制定者....那些麻煩製造者性能。 – 2010-08-02 20:10:51

+0

@ Dr.Wily'sApprentice您可否解釋一下爲什麼這是必要的? (尤其是私人領域)我的意思是,由於反思,甚至有可能訪問私人領域和屬性? - Wohh ..看着它..這是可能的。我什麼也沒說。 – LuckyLikey 2015-05-12 12:27:53

回答

29

我最初的答案是不正確 - 請給予STO的回答道具:

propertyInfo.CanWritedocumentation

propertyInfo.GetSetMethoddocumentation

+0

這看起來對我來說是最乾淨的方法。 – mpenrow 2010-08-02 18:06:26

+2

我不相信你可以使用BindingFlags.SetProperty來查詢具有setter的屬性。當您想執行涉及實際設置屬性的操作時(例如使用Type.InvokeMember方法),可以使用該標誌。 – 2010-08-02 20:08:23

+13

這不起作用。使用下面STO提出的任何方法,並確保閱讀Wily博士的學徒對他們之間差異的評論。 – JonathanK 2010-12-14 22:39:02

12
propertyInfo.GetSetMethod() != null 
71

PropertyInfo.CanWritedocumentation

PropertyInfo.GetSetMethoddocumentation

+0

這肯定會起作用,但您必須爲每個房產做額外的檢查。通過設置BindingFlags.SetProperty,您將只會檢索包含setter的屬性。 – 2010-08-02 18:02:46

+14

我會建議使用PropertyInfo.GetSetMethod並檢查它是否爲null; PropertyInfo.CanWrite方法將在屬性中存在私有,受保護或內部集合時返回true。如果該屬性中實際上沒有setter,它將只返回false。 – 2010-08-02 20:06:22

+0

這個完美的作品。 – vtortola 2012-02-28 18:34:40

相關問題