C#如何透過物件屬性名修改值的實例

黄舟
發布: 2017-09-18 11:01:29
原創
3588 人瀏覽過

摘自:csdn

給一個物件屬性賦值可以透過PropertyInfo.SetValue()方式進行賦值,但要注意值的型別要與屬性保持一致。

建立物件實例的兩個方法: 

1. 


#
var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName");
登入後複製

2.

 
var
 obj = Activator.CreateInstance(ClassType);
登入後複製

建立好實例時,現在可以給目前實例的某個屬性賦值,先取得要賦值的屬性。


var property = obj.GetType().GetProperty("PropertyName");//此时可以使用GetProperty获取属性数组,循环进行赋值,这里主要讲解类型问题。
登入後複製

賦值可透過PropertyInfo.SetValue()方法,詳見MSDN。

情況1,此屬性型別是已知型別,例如:int


int value=500;
property.SetValue(obj,value,null);
登入後複製

這裡需要注意value值的型別必須和屬性型別一致,否則會拋出TargetException異常。

情況2,此屬性類型是已知類型,原值是其他類型。例如:目標類型為int,值為string


string value="500";
property.SetValue(obj,int.TryParse(value),null);//类型转换。
登入後複製

前兩種情況都很簡單,有時業務會比較複雜,對目標類型不確定,需要程式執行時判斷。

情況3,此屬性類型是未知非泛型類型,不確定目標類型,如何進行類型轉換。


object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//类型转换。
登入後複製

這樣就可以解決大多數問題了。

不知道大家有沒有註意,我在第三種情況強調了非泛型,難道泛型就不行了嗎?
是的。如果只是用Convert.ChangeType()方法,類型轉換還是會報錯,先看下面的程式碼。

即使目標類型和值的類型是一致,透過Convert.ChangeType()進行轉換仍然報錯。
解決這個問題,就要先把屬性值類型轉換成基底類型後,在進行Convert轉換。看程式碼這樣,使用Convert.ChangeType()轉換可空型別時,就不會報錯了。
再增加一些基礎的判斷驗證,程式碼就比較完善了。


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#如何透過物件屬性名修改值的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板