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。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- C# PropertyInfo類案例詳解
- C#使用NPOI將excel導入到list的方法
- C# 通過反射獲取類型的字段值及給字段賦值的操作
- C#中的DataTable查詢實戰教程
- C#中Hashtable和Dictionary的區別與用法示例