2012-10-19 240 views
21

可能重複:
.Net - Reflection set object property
Setting a property by reflection with a string valueC#動態設置屬性

我敢肯定有這樣做的一個簡單的方法,我是厚,但我可以」琢磨出我的生活。

我有一個對象具有多個屬性。我們調用對象objName。我試圖創建一個方法,只是用新的屬性值更新對象。

我希望能夠做的方法如下:

private void SetObjectProperty(string propertyName, string value, ref object objName) 
{ 
    //some processing on the rest of the code to make sure we actually want to set this value. 
    objName.propertyName = value 
} 

最後,調用:

SetObjectProperty("nameOfProperty", textBoxValue.Text, ref objName); 

希望的問題是充實就夠了。讓我知道你是否需要更多細節。

感謝您的回答!

+0

@DavidArcher在C#中沒有'rel'鍵盤...我認爲你的意思是'ref'?除非您打算更改實際的實例,否則不需要將對象作爲'ref'傳遞。 – James

+0

的確,我確實是指ref,是的,我打算改變實際的實例。 –

回答

40

objName.GetType().GetProperty("nameOfProperty").SetValue(objName, objValue, null)

+1

你應該在'GetProperty()'內使用'propertyName'。 – Anonymous

+0

如果「* nameOfProperty *」不存在? – James

+0

例外當然,你可以使用GetProperties來測試。 – josejuan

26

您可以使用Reflection來執行此操作,例如

private void SetObjectProperty(string propertyName, string value, object obj) 
{ 
    PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName); 
    // make sure object has the property we are after 
    if (propertyInfo != null) 
    { 
     propertyInfo.SetValue(obj, value, null); 
    } 
} 
+2

支持在調用之前檢查null。 –

1

首先取得屬性信息,然後設置該屬性的值:

PropertyInfo propertyInfo = objName.GetType().GetProperty(propertyName); 
propertyInfo.SetValue(propertyInfo, value, null); 
3

您可以使用Type.InvokeMember做到這一點。

private void SetObjectProperty(string propertyName, string value, rel objName) 
{ 
    objName.GetType().InvokeMember(propertyName, 
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
     Type.DefaultBinder, objName, value); 
} 
1

您可以通過反射做到這一點:

void SetObjectProperty(object theObject, string propertyName, object value) 
{ 
    Type type=theObject.GetType(); 
    var property=type.GetProperty(propertyName); 
    var setter=property.SetMethod(); 
    setter.Invoke(theObject, new ojbject[]{value}); 
} 

注意:錯誤處理故意留出的可讀性的原因。