考慮以下代碼:的SetValue反射在C#
var future = new Future();
future.GetType().GetProperty(info.Name).SetValue(future, converted);
在上面的代碼,我們應該傳遞兩個參數爲SetValue
。首先,我們要設置其屬性的對象。其次,新的價值。但是我們選擇特定的屬性。
爲什麼我們應該通過第一個參數來設置值,因爲我們已經設置了未來的對象!?
考慮以下代碼:的SetValue反射在C#
var future = new Future();
future.GetType().GetProperty(info.Name).SetValue(future, converted);
在上面的代碼,我們應該傳遞兩個參數爲SetValue
。首先,我們要設置其屬性的對象。其次,新的價值。但是我們選擇特定的屬性。
爲什麼我們應該通過第一個參數來設置值,因爲我們已經設置了未來的對象!?
因爲未來對象是一個實例。 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設置其他實例的屬性。
您尚未設置未來對象 - 您只需提取其類型,然後對其進行操作。你最終得到的是一個PropertyInfo
對象,它指向Future
類型的任何實例上的該屬性。
這裏
future.GetType()
future
僅用於獲得它的類型。有效是一樣
Type t = future.GetType();
t.GetProperty(info.Name).SetValue(future, converted);
在上述所有關於使用什麼對象來獲取類型丟失知識代碼的第二行,我們正在處理的類型本身。後來,當我們獲得有關該類型屬性的信息時,我們需要知道它應與哪個對象配合使用,因此我們再次提供future
。
你可以很容易地做到以下幾點:
typeof(Future).GetProperty(info.Name).SetValue(future, converted);
怎能實例沒有future
參數一起服用?
考慮以下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
未綁定到一個實例,而是一個類型。
如果每個對象都必須記住它的獲取方式,那麼反射會(更)變得非常複雜,以至於它可以在以後使用保留的信息,而不是通過參數再次請求它。即有很多方法可以獲得'Type',但不是所有的方法都需要首先使用該類型的實例。 –