2011-05-16 68 views
2

我NEAD設置屬性爲對象在C#中的動態,塞汀屬性值

Personi p = new Personi();//this class has a property Datelindja(DateTime) 
p.Emri = "Florim"; 
p.Mbiemri = "Maxhuni"; 
SetValue(p, "Datelindja", DateTime.Now); //I nead these method. using dynamic keyword 
Console.WriteLine(p.Ditelindja); 

我如何實現此方法,將設置這些參數值的基礎。

方法簽名

SetValue(dynamic orgObj, string property, dynamic value) 

對不起我的英語不好。

回答

3

我不明白你爲什麼需要dynamic這裏。
SetValue將需要使用反射:

void SetValue<TInstance, TValue>(TInstance orgObj, string property, TValue value) 
{ 
    orgObj.GetType().GetProperty(property).SetValue(orgObj, value, null); 
} 

你也可以寫不使用泛型這種方法,因爲他們沒有在這種情況下增加任何的好處:

void SetValue(object orgObj, string property, object value) 
{ 
    orgObj.GetType().GetProperty(property).SetValue(orgObj, value, null); 
} 
1

ImpromptuInterface有一個開放源代碼項目方法Impromptu.InvokeSet使用DLR管道來完成。雖然在你的例子中,你確實可以使用反射,因爲對象本身不是一個IDynamicMetaObjectProvider,但是通過使用ImpromptuInterface(dlr),它不僅更加靈活,而且反射速度平均快3倍。

Impromptu.InvokeSet(p,"Datelindja", DateTime.Now)