溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#之怎樣通過(guò)對(duì)象屬性名修改值

發(fā)布時(shí)間:2020-05-11 16:02:08 來(lái)源:億速云 閱讀:911 作者:Leah 欄目:編程語(yǔ)言

今天小編就為大家?guī)?lái)一篇C#中怎樣通過(guò)對(duì)象屬性名修改值的文章。小編覺(jué)得挺不錯(cuò)的,為此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

給一個(gè)對(duì)象屬性賦值可以通過(guò)PropertyInfo.SetValue()方式進(jìn)行賦值,但要注意值的類型要與屬性保持一致。

創(chuàng)建對(duì)象實(shí)例的兩種方法:

1.


var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName");

2.

 var
 obj = Activator.CreateInstance(ClassType);

創(chuàng)建好實(shí)例時(shí),現(xiàn)在可以給當(dāng)前實(shí)例的某個(gè)屬性賦值,首先獲取要賦值的屬性。


var property = obj.GetType().GetProperty("PropertyName");//此時(shí)可以使用GetProperty獲取屬性數(shù)組,循環(huán)進(jìn)行賦值,這里主要講解類型問(wèn)題。

賦值可通過(guò)PropertyInfo.SetValue()方法,詳見(jiàn)MSDN。

情況1,該屬性類型是已知類型,例如:int


int value=500;
property.SetValue(obj,value,null);

這里需要注意value值的類型必須和屬性類型一致,否則會(huì)拋出TargetException異常。

情況2,該屬性類型是已知類型,原值是其他類型。例如:目標(biāo)類型為int,值為string


string value="500";
property.SetValue(obj,int.TryParse(value),null);//類型轉(zhuǎn)換。

前兩種情況都很簡(jiǎn)單,有時(shí)業(yè)務(wù)會(huì)比較復(fù)雜,對(duì)目標(biāo)類型不確定,需要程序運(yùn)行時(shí)判斷。

情況3,該屬性類型是未知非泛型類型,不確定目標(biāo)類型,如何進(jìn)行類型轉(zhuǎn)換。


object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//類型轉(zhuǎn)換。

這樣就可以解決大多數(shù)問(wèn)題了。

不知道大家有沒(méi)有注意,我在第三種情況強(qiáng)調(diào)了非泛型,難道泛型就不行了嗎?
是的。如果只是用Convert.ChangeType()方法,類型轉(zhuǎn)換仍然報(bào)錯(cuò),先看下面的代碼。

即使目標(biāo)類型和值的類型是一致,通過(guò)Convert.ChangeType()進(jìn)行轉(zhuǎn)換仍然報(bào)錯(cuò)。
解決這個(gè)問(wèn)題,就要先把屬性值類型轉(zhuǎn)成基類型后,在進(jìn)行Convert轉(zhuǎn)換??创a這樣,在使用Convert.ChangeType()轉(zhuǎn)換可空類型時(shí),就不會(huì)報(bào)錯(cuò)了。
再增加一些基礎(chǔ)的判斷驗(yàn)證,代碼就比較完善了。


if (!property.PropertyType.IsGenericType)
            {                //非泛型
                property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, property.PropertyType), null);
            }            else
            {                //泛型Nullable<>
                Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition();                
                if (genericTypeDefinition == typeof(Nullable<>))
                {
         property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null);
                }
            }

上述就是C#中怎樣通過(guò)對(duì)象屬性名修改值的詳細(xì)內(nèi)容,詳細(xì)使用情況還需要大家自己動(dòng)手實(shí)驗(yàn)使用過(guò)才能領(lǐng)會(huì)。如果想了解更多,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI