1. 程式人生 > >C# 反射給物件賦值遇到的問題——型別轉換

C# 反射給物件賦值遇到的問題——型別轉換

建立物件例項的兩種方法: 

1.

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

2.

1 var obj = Activator.CreateInstance(ClassType);

以後有時間再把這兩種的區別詳細講一下。

建立好例項時,現在可以給當前例項的某個屬性賦值,首先獲取要賦值的屬性。

1 var property = obj.GetType().GetProperty("PropertyName"
);//此時可以使用GetProperty獲取屬性陣列,迴圈進行賦值,這裡主要講解型別問題。

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

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

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

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

1 2 string value="500"; property.SetValue(obj,int.TryParse(value),
null);//型別轉換。

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

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

1 2 object value="500"; property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//型別轉換。

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

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


即使目標型別和值的型別是一致,通過Convert.ChangeType()進行轉換仍然報錯。
解決這個問題,就要先把屬性值型別轉成基型別後,在進行Convert轉換。看程式碼


這樣,在使用Convert.ChangeType()轉換可空型別時,就不會報錯了。
再增加一些基礎的判斷驗證,程式碼就比較完善了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 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# 反射物件遇到的問題——型別轉換

建立物件例項的兩種方法:  1. 1 var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName"); 2. 1 var obj = Activator.Creat

[深入學習C#]利用反射物件

  C#中利用反射能夠獲取物件的屬性資訊,也可以利用反射給物件賦值。   我們如果想利用凡是給一個物件屬性賦值可以通過PropertyInfo.SetValue()方式進行賦值,但要注意值的型別要與屬

反射物件遇到的問題——型別轉換

建立物件例項的兩種方法:  1. 1 var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName"); 2. 1 var obj = Activator.Cre

Java 反射物件

java反射無所不能,辣麼,怎麼通過反射設定一個屬性的值呢? 主程式: /** * @author tengqingya * @create 2017-03-05 15:54 */ public class TestReflectSet { private S

C# 反射物件屬性遇到的問題——型別轉換

建立物件例項的兩種方法:  1. 1 var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName"); 2. 1 var obj = Activator.Create

c# 遍歷物件屬性物件

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls

Java 使用反射屬性

package com.nf147.manage.spring;import java.lang.reflect.Field;public class Cat { private String name; @Override public String toString() {

mybatis物件

一、先來看我定義的物件: Account { private Organization organization; private int id; getter/setter.... } Orga

JAVA反射——屬性

使用反射的機制來給私有的屬性賦值,這個原理在許多ORM的元件中都有應用,下面是一段掩飾程式碼 public class FieldTest { public static void main(String[] args) throws Exception { Class clazz = Class.

Java開發筆記(三十四)字串的型別轉換

不管是基本的char字元型,還是包裝字元型別Character,它們的每個變數只能存放一個字元,無法滿足對一串字元的加工。為了能夠直接操作一連串的字元,Java設計了專門的字串型別String,該型別允許儲存一整串字元,並對字串進行各種處理。字串型別不屬於基本型別,它的用法與包裝型別更為接近。例如給字串變數賦

java使用反射物件屬性的兩種方法

java反射無所不能,辣麼,怎麼通過反射設定一個屬性的值呢?  主程式: /**  * @author tengqingya  * @create 2017-03-05 15:54  */ public class TestReflectSet { &nb

java使用反射物件屬性和取

public class Rwhc implements Comparator<Rwhc> { private int id; //id private String qihao; //期號 private String kjh;

c# 通過反射動態為物件 通用方法

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Configuration; using System.Data; using

反射對象——類型轉換

-1 microsoft 比較 lai pan eof code edit cti 文章轉自: http://blog.csdn.net/xiaohan2826/article/details/8536074 反射給對象賦值遇到的問題——類型轉換 發布時間:2012-10-

解決vue A物件B物件,修改B屬性會影響到A的問題

實際在vue中 this.A = this.B,沒有進行深層賦值,只是把this.A的地址指向了與this.B相同的地址,所有對於A的修改會影響到B。 解決相互影響的思路是在this.A必須是新建的一個物件,這樣才能保證不被指向同一地址,屬性修改不會相互影響。 解決方式: 前端精品教程:百度網盤下載

java 物件的成員變數兼任型別, (若有泛型也相容型別)

在學Spring 依賴注入 通過 註解@Autowired 可以自動執行欄位, 方法等. 很好奇那欄位是如何相容型別賦值的, 而且自動泛型注入(判斷)     功能沒有做完, 做的也很籠統, 希望指教。      /*  

python 基礎知識點(三)解壓可迭代物件多個變數

問題 如果一個可迭代物件的元素個數超過變數個數時,會丟擲一個 ValueError 。 那麼怎樣才能從這個可迭代物件中解壓出 N 個元素出來? 解決方案 Python 的星號表示式可以用來解決這個問題。比如,你在學習一門課程,在學期末的時候, 你想統計下家庭作業的平均成績,但是排除掉

建立javaScript自定義物件,並屬性

一、直接建立物件例項 方法一: var obj=new Object(); obj.name="bill"; obj.id="123"; 方法二: var obj={name:"bill",id:"

c中把shortchar陣列

網上很多方法都是使用sprintf來做的,但我要的結果不是這樣的,我只是要int的二進位制放到char裡就完事了,sprintf好像不是這樣,如果是的話,請留言糾正。話不多說,直接上原始碼:char angle[10]; short s = 1000; angle[1] =

淺談將子類物件父類物件

最近對將子類物件賦值給父類物件有點心得,想和大家分享一下,但本人水平有限,請各位指正和批評。言歸正傳,下面是幾個小例子,請大家看一看。 測試一 父類: public class Supclass { public void print() {