1. 程式人生 > 程式設計 >C# 中屬性PropertyInfo的setvalue用法說明

C# 中屬性PropertyInfo的setvalue用法說明

下面是關於setvalue方法的介紹以及錯誤簡介

用索引化屬性的可選索引值設定指定物件的該屬性值。

C#

public virtual void SetValue (object obj,object value,object[] index);

引數

obj Object

將設定其屬性值的物件。

value Object

新的屬性值。

index Object[]

索引化屬性的可選索引值。 對於非索引化屬性,該值應為 null。

實現

SetValue(Object,Object,Object[])

異常

ArgumentException

index 陣列不包含所需的引數型別。

或 找不到該屬性的 set 取值函式。

或 - value 無法轉換為 PropertyType的型別。

TargetException

在適用於 Windows 應用商店應用的 .NET 或可移植類庫中,改為捕獲 Exception。

該物件與目標型別不匹配,或者某屬性是例項屬性但 obj 為 null。

TargetParameterCountException

index 中的引數數量與索引屬性採用的引數數量不匹配。

MethodAccessException

在適用於 Windows 應用商店應用的 .NET 或可移植類庫中,改為捕獲基類異常 MemberAccessException。

試圖非法訪問類中的私有或受保護方法。

TargetInvocationException

設定屬性值時出錯。 例如,為一個索引屬性指定的索引值超出範圍。 InnerException 屬性指示出錯的原因。

例子

Dictionary<string,string> dic = new Dictionary<string,string>();
  foreach (Control control in this.Controls )//獲取控制元件中所有值,新增到字典中
  {
  if (control is TextBox ||control is ComboBox ||control is DateTimePicker )
  {
   dic.Add (control.Name,control.Text);
  }
  }
  PropertyInfo[] propertys = incomingnews.GetType().GetProperties();
  foreach (PropertyInfo property in propertys)//運用propertyinfo的對映方法,給實體類incomingnews的所有屬性賦值。
  {
  for (int i = 0; i<dic.Count; i++)
  {
   property.SetValue(incomingnews,dic[property.Name].ToString(),null);
  }
  }

之前有個小錯誤一直弄不出來,後來看了錯誤提示“index 陣列不包含所需的引數型別。

或 找不到該屬性的 set 取值函式。

或 value 無法轉換為 PropertyType的型別。”

發現自己想要賦值的實體類不是實體的屬性,而是實體的欄位,所以setvalue方法就捕捉不到我想要賦值的這些欄位,只需要將這些欄位設定為自動屬性即可。

補充:C# Property.SetValue()利用反射給某個泛型物件的屬性賦值的問題

問題描述:

在一個泛型方法中,例項化一個泛型物件後,利用反射獲取該泛型中的所有屬性,再給該物件的這些屬性賦值,打斷點發現,泛型物件被例項化出來了,沒有問題;所要賦值的屬性值也沒有問題,但呼叫Property.SetValue()後,泛型物件中的值就是賦不上。

問題解決:

呼叫該泛型方法時,傳入的型別是個結構體。。這個方法只支援class,不支援struct。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。