欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 中属性PropertyInfo的setvalue用法说明

程序员文章站 2022-03-25 12:47:26
下面是关于setvalue方法的介绍以及错误简介用索引化属性的可选索引值设置指定对象的该属性值。c#public virtual void setvalue (object obj, object v...

下面是关于setvalue方法的介绍以及错误简介

用索引化属性的可选索引值设置指定对象的该属性值。

c#

public virtual void setvalue (object obj, object value, object[] index);

参数

obj object

将设置其属性值的对象。

value object

新的属性值。

index object[]

索引化属性的可选索引值。 对于非索引化属性,该值应为 null。

实现

setvalue(object, object, object[])

异常

argumentexception

index 数组不包含所需的参数类型。

或 找不到该属性的 set 取值函数。

或 - value 无法转换为 propertytype的类型。

targetexception

在适用于 windows 应用商店应用的 .net 或可移植类库中,改为捕获 exception。

该对象与目标类型不匹配,或者某属性是实例属性但 obj 为 null。

targetparametercountexception

index 中的参数数量与索引属性采用的参数数量不匹配。

methodaccessexception

在适用于 windows 应用商店应用的 .net 或可移植类库中,改为捕获基类异常 memberaccessexception。

试图非法访问类中的私有或受保护方法。

targetinvocationexception

设置属性值时出错。 例如,为一个索引属性指定的索引值超出范围。 innerexception 属性指示出错的原因。

例子

dictionary<string, string> dic = new dictionary<string, string>();
  foreach (control control in this.controls )//获取控件中所有值,添加到字典中
  {
  if (control is textbox ||control is combobox ||control is datetimepicker )
  {
   dic.add (control.name, control.text);
  }
  }
  propertyinfo[] propertys = incomingnews.gettype().getproperties();
  foreach (propertyinfo property in propertys)//运用propertyinfo的映射方法,给实体类incomingnews的所有属性赋值。
  {
  for (int i = 0; i<dic.count; i++)
  {
   property.setvalue(incomingnews, dic[property.name].tostring(), null);
  }
  }

之前有个小错误一直弄不出来,后来看了错误提示“index 数组不包含所需的参数类型。

或 找不到该属性的 set 取值函数。

或 value 无法转换为 propertytype的类型。”

发现自己想要赋值的实体类不是实体的属性,而是实体的字段,所以setvalue方法就捕捉不到我想要赋值的这些字段,只需要将这些字段设置为自动属性即可。

补充:c# property.setvalue()利用反射给某个泛型对象的属性赋值的问题

问题描述:

在一个泛型方法中,实例化一个泛型对象后,利用反射获取该泛型中的所有属性,再给该对象的这些属性赋值,打断点发现,泛型对象被实例化出来了,没有问题;所要赋值的属性值也没有问题,但调用property.setvalue()后,泛型对象中的值就是赋不上。

问题解决:

调用该泛型方法时,传入的类型是个结构体。。这个方法只支持class,不支持struct。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。