2013-12-18 20 views
3

我所看到的各種問題提出並回答了,我們可以調用使用反射私人器例如這一個:如何設置的屬性值不存在二傳手

Is it possible to get a property's private setter through reflection?

不過,我有一些代碼其中有一個屬性,我需要設置,但不能因爲沒有setter,我不能添加setter,因爲這不是我的代碼。有沒有辦法以某種方式在這種情況下使用反射設置值?

+5

屬性沒有值。他們可能有一些可能會改變另一個領域價值的制定者。如果您有興趣找到自動生成的屬性的支持字段,請參閱此問題:http://stackoverflow.com/questions/8817070/is-it-possible-to-access-backing-fields-behind-auto -implemented-properties – Rotem

回答

7

你必須記住,一個屬性只是一對方法的語法糖。一種方法(getter)返回屬性類型的值,一種方法(setter)接受屬性類型的值。

沒有要求getter和setter實際獲取或設置任何東西。他們只是方法,所以他們可以做任何事情。唯一的要求是getter返回一個值。從外面看,你無法真正辨別是否有後盾領域。每次調用getter時都可以計算出來。它可能基於其他屬性。

所以,不,一般沒有任何方法可以「設置」一個沒有setter的屬性。

4

我不建議你的應用程序這樣做,但對於測試目的可能是有用的...

假設你有:

public class MyClass 
{ 
    public int MyNumber {get;} 
} 

,如果你能做到這一點的測試目的,我不會建議在運行時代碼中使用它:

var field = typeof(MyClass).GetField("<MyNumber>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic); 
field.SetValue(anIstanceOfMyClass, 3); 
+0

謝謝。我試圖改變一個只有getter屬性的值,並且絕對沒有辦法爲該屬性添加setter - 這有所幫助。 –