反射时用SetValue方法,报“不能从目标类型扩展到基元类型”

博客指出将从数据库查询所得的值赋给对象属性时,因数据类型不一致,会出现“不能从目标类型扩展到基元类型”错误。如将数据库bigint字段值直接赋给对象的int属性就会报错,建议用户自行显式转换为目标属性类型。

Type objType;
System.Reflection.PropertyInfo prop;
User objUser = new User(); //比如有两个属性 Name (string类型),Age (int类型)
objType = objUser.GetType();


prop = objType.GetProperty( "Age" );
prop.SetValue(objUser,2,null);
//转换数字类型时报“不能从目标类型扩展到基元类型”错误。
奇怪ing...

这种情况主要是由于数据类型不一致,尤其是当要赋的值是从数据库里查询所得,如从数据库里查询一个bigint字段的值,而把该值直接赋给对象的int 属性,就会出现上面的错误。

对于这样的类型,用户要自己显示的把它转换为要赋值对象的属性类型。

C# 中,`SetValue` 方法是 `PropertyInfo` 和 `FieldInfo` 类的成员,用于设置对象的属性或字段的值。以下是这两个类中 `SetValue` 方法参数的作用: ### `PropertyInfo.SetValue` 方法 `PropertyInfo.SetValue` 方法用于设置指定对象上属性的值,其方法签名如下: ```csharp public void SetValue(object obj, object value, object[] index); ``` - `obj`:表示要设置属性值的对象实例。如果属性是静态的,该参数可以为 `null`。例如,有一个 `Person` 类的实例 `person`,若要设置其 `Name` 属性,就可以将 `person` 作为该参数传入。 - `value`:要设置给属性的值。该值的类型必须与属性的类型兼容,否则可能会抛出异常。比如 `Name` 属性是 `string` 类型,那么传入的值就应该是字符串类型。 - `index`:如果属性是索引属性,则该参数是一个包含索引值的数组;如果属性不是索引属性,则该参数为 `null`。例如,对于一个二维数组的索引属性,可能需要传入一个包含两个索引值的数组。 ### `FieldInfo.SetValue` 方法 `FieldInfo.SetValue` 方法用于设置指定对象上字段的值,其方法签名如下: ```csharp public void SetValue(object obj, object value); ``` - `obj`:表示要设置字段值的对象实例。如果字段是静态的,该参数可以为 `null`。同样以 `Person` 类为例,若要设置其某个字段的值,就需要传入 `Person` 类的实例。 - `value`:要设置给字段的值。该值的类型必须与字段的类型兼容,否则可能会抛出异常。 以下是一个简单的示例代码,演示了 `PropertyInfo.SetValue` 方法的使用: ```csharp using System; using System.Reflection; class Person { public string Name { get; set; } } class Program { static void Main() { Person person = new Person(); PropertyInfo property = typeof(Person).GetProperty("Name"); property.SetValue(person, "John"); Console.WriteLine(person.Name); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值