菜单

C# 反射给指标赋值碰到的标题——类型转换

2019年5月13日 - 皇家赌场系统

反射给指标赋值遇到的标题——类型转换

给一个指标属性赋值能够通过PropertyInfo.SetValue()格局张开赋值,但要注意值的品种要与质量保持1致。   

创建对象实例的二种方法: 

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获取属性数组,循环进行赋值,这里主要讲解类型问题。

赋值可通过PropertyInfo.SetValue()方法,详见MSDN。

 

气象一,该属性类型是已知类型,举个例子: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);//类型转换。

 

前两种状态都异常粗略,有的时候职业会比较复杂,对目标项目不分明,要求程序运营时决断。

 

场合三,该属性类型是未知非泛型类型,不分明目的项目,怎么着进展类型转变。

1
2
object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//类型转换。

 

诸如此类就可以消除一大半标题了。

 

不知道我们有未有理会,笔者在第三种景况强调了非泛型,难道泛型就万分了啊?
正确。假若只是用Convert.ChangeType()方法,类型转变如故报错,先看下边包车型客车代码。

图片 1

就算目的项目和值的项目是均等,通过Convert.ChangeType()进行更改照旧报错。
消除这些主题材料,将要先把属性值类型转成基类型后,在拓展Convert转变。看代码

图片 2

那样,在选取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);
                }
            }

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图