2013-08-12 66 views
9

考慮以下代碼:的SetValue反射在C#

var future = new Future(); 
future.GetType().GetProperty(info.Name).SetValue(future, converted); 

在上面的代碼,我們應該傳遞兩個參數爲SetValue。首先,我們要設置其屬性的對象。其次,新的價值。但是我們選擇特定的屬性。

爲什麼我們應該通過第一個參數來設置值,因爲我們已經設置了未來的對象!?

+2

如果每個對象都必須記住它的獲取方式,那麼反射會(更)變得非常複雜,以至於它可以在以後使用保留的信息,而不是通過參數再次請求它。即有很多方法可以獲得'Type',但不是所有的方法都需要首先使用該類型的實例。 –

回答

18

因爲未來對象是一個實例。 PropertyInfo從類型(Type type = future.GetType();)中檢索並且未綁定到任何實例。這就是爲什麼您必須通過SetValue()中的實例。

所以:

var future = new Future(); 

var propertyName = "..."; 
Type type = future.GetType(); 
PropertyInfo propertyInfo = type.GetProperty(propertyName); 

propertyInfo.SetValue(future, value); 

可以重用的PropertyInfo設置其他實例的屬性。

4

您尚未設置未來對象 - 您只需提取其類型,然後對其進行操作。你最終得到的是一個PropertyInfo對象,它指向Future類型的任何實例上的該屬性。

5

這裏

future.GetType() 

future僅用於獲得它的類型。有效是一樣

Type t = future.GetType(); 
t.GetProperty(info.Name).SetValue(future, converted); 

在上述所有關於使用什麼對象來獲取類型丟失知識代碼的第二行,我們正在處理的類型本身。後來,當我們獲得有關該類型屬性的信息時,我們需要知道它應與哪個對象配合使用,因此我們再次提供future

1

你可以很容易地做到以下幾點:

typeof(Future).GetProperty(info.Name).SetValue(future, converted); 

怎能實例沒有future參數一起服用?

1

考慮以下2類:

class Future 
{ 
    public int MyProperty { get; set; } 
} 
class FarFuture : Future { } 

這個代碼看看:

var future = new Future(); 
var farFuture = new FarFuture(); 
future.GetType().GetProperty(info.Name).SetValue(farFuture, converted); 

PropertyInfo未綁定到一個實例,而是一個類型。