C# 中屬性PropertyInfo的setvalue用法說(shuō)明
下面是關(guān)于setvalue方法的介紹以及錯(cuò)誤簡(jiǎn)介
用索引化屬性的可選索引值設(shè)置指定對(duì)象的該屬性值。
C#
public virtual void SetValue (object obj, object value, object[] index);
參數(shù)
obj Object
將設(shè)置其屬性值的對(duì)象。
value Object
新的屬性值。
index Object[]
索引化屬性的可選索引值。 對(duì)于非索引化屬性,該值應(yīng)為 null。
實(shí)現(xiàn)
SetValue(Object, Object, Object[])
異常
ArgumentException
index 數(shù)組不包含所需的參數(shù)類型。
或 找不到該屬性的 set 取值函數(shù)。
或 - value 無(wú)法轉(zhuǎn)換為 PropertyType的類型。
TargetException
在適用于 Windows 應(yīng)用商店應(yīng)用的 .NET 或可移植類庫(kù)中,改為捕獲 Exception。
該對(duì)象與目標(biāo)類型不匹配,或者某屬性是實(shí)例屬性但 obj 為 null。
TargetParameterCountException
index 中的參數(shù)數(shù)量與索引屬性采用的參數(shù)數(shù)量不匹配。
MethodAccessException
在適用于 Windows 應(yīng)用商店應(yīng)用的 .NET 或可移植類庫(kù)中,改為捕獲基類異常 MemberAccessException。
試圖非法訪問(wèn)類中的私有或受保護(hù)方法。
TargetInvocationException
設(shè)置屬性值時(shí)出錯(cuò)。 例如,為一個(gè)索引屬性指定的索引值超出范圍。 InnerException 屬性指示出錯(cuò)的原因。
例子
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)//運(yùn)用propertyinfo的映射方法,給實(shí)體類incomingnews的所有屬性賦值。 { for (int i = 0; i<dic.Count; i++) { property.SetValue(incomingnews, dic[property.Name].ToString(), null); } }
之前有個(gè)小錯(cuò)誤一直弄不出來(lái),后來(lái)看了錯(cuò)誤提示“index 數(shù)組不包含所需的參數(shù)類型。
或 找不到該屬性的 set 取值函數(shù)。
或 value 無(wú)法轉(zhuǎn)換為 PropertyType的類型?!?/p>
發(fā)現(xiàn)自己想要賦值的實(shí)體類不是實(shí)體的屬性,而是實(shí)體的字段,所以setvalue方法就捕捉不到我想要賦值的這些字段,只需要將這些字段設(shè)置為自動(dòng)屬性即可。
補(bǔ)充:C# Property.SetValue()利用反射給某個(gè)泛型對(duì)象的屬性賦值的問(wèn)題
問(wèn)題描述:
在一個(gè)泛型方法中,實(shí)例化一個(gè)泛型對(duì)象后,利用反射獲取該泛型中的所有屬性,再給該對(duì)象的這些屬性賦值,打斷點(diǎn)發(fā)現(xiàn),泛型對(duì)象被實(shí)例化出來(lái)了,沒(méi)有問(wèn)題;所要賦值的屬性值也沒(méi)有問(wèn)題,但調(diào)用Property.SetValue()后,泛型對(duì)象中的值就是賦不上。
問(wèn)題解決:
調(diào)用該泛型方法時(shí),傳入的類型是個(gè)結(jié)構(gòu)體。。這個(gè)方法只支持class,不支持struct。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#驗(yàn)證碼識(shí)別基礎(chǔ)方法實(shí)例分析
這篇文章主要介紹了C#驗(yàn)證碼識(shí)別基礎(chǔ)方法實(shí)例分析,較為詳細(xì)的總結(jié)了C#驗(yàn)證碼的實(shí)現(xiàn)思路及具體步驟,并對(duì)實(shí)現(xiàn)思路進(jìn)行了總結(jié)歸納,具有很好的實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09C#開(kāi)發(fā)Windows服務(wù)實(shí)例之實(shí)現(xiàn)禁止QQ運(yùn)行
這篇文章主要介紹了通過(guò)C#開(kāi)發(fā)Windows服務(wù),查殺qq進(jìn)程的服務(wù)功能,需要的朋友可以參考下2013-10-10Unity實(shí)現(xiàn)紅酒識(shí)別的示例代碼
本文主要介紹了如何通過(guò)Unity實(shí)現(xiàn)紅酒識(shí)別,可以實(shí)現(xiàn)識(shí)別圖像中的紅酒標(biāo)簽,返回紅酒名稱、國(guó)家、產(chǎn)區(qū)、酒莊、類型、糖分、葡萄品種、酒品描述等信息,感興趣的可以學(xué)習(xí)一下2022-02-02C# Winform下載文件并顯示進(jìn)度條的實(shí)現(xiàn)代碼
本來(lái)是要研究怎樣判斷下載完成,結(jié)果找到這個(gè)方法,可以在這個(gè)方法完成之后提示下載完成,需要的朋友可以參考下2014-07-07C#中調(diào)用Windows API的技術(shù)要點(diǎn)說(shuō)明
本篇文章主要是對(duì)C#中調(diào)用Windows API的技術(shù)要點(diǎn)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01C#實(shí)現(xiàn)快遞api接口調(diào)用方法
這篇文章主要介紹了C#實(shí)現(xiàn)快遞api接口調(diào)用方法,主要是通過(guò)快遞API網(wǎng)接口的服務(wù),使用的時(shí)候直接申請(qǐng)個(gè)接口UID即可,有需要的小伙伴來(lái)參考下吧。2015-03-03C#?Timer控件學(xué)習(xí)之使用Timer解決按鈕冪等性問(wèn)題
Timer控件又稱定時(shí)器控件或計(jì)時(shí)器控件,該控件的主要作用是按一定的時(shí)間間隔周期性地觸發(fā)一個(gè)名為Tick的事件,因此在該事件的代碼中可以放置一些需要每隔一段時(shí)間重復(fù)執(zhí)行的程序段,這篇文章主要介紹了關(guān)于C#使用Timer解決按鈕冪等性問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-10-10C#通過(guò)NPOI操作Excel的實(shí)例代碼
C#操作Excel的方法有很多種,本文介紹了C#通過(guò)NPOI操作Excel,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01