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中把short賦值給char陣列
網上很多方法都是使用sprintf來做的,但我要的結果不是這樣的,我只是要int的二進位制放到char裡就完事了,sprintf好像不是這樣,如果是的話,請留言糾正。話不多說,直接上原始碼:char angle[10]; short s = 1000; angle[1] =
淺談將子類物件賦值給父類物件
最近對將子類物件賦值給父類物件有點心得,想和大家分享一下,但本人水平有限,請各位指正和批評。言歸正傳,下面是幾個小例子,請大家看一看。 測試一 父類: public class Supclass { public void print() {