我想实现用反射遍历一个类的所有属性,并用PropertyInfo.SetValue()方法给指定的此类实例(对象)的特定属性赋值;但问题是对象中不同属性的类型是不同的,如果要用SetValue()方法赋值,必须要对使用的数据针对属性类型进行转换类型转换我现在在用Convert.ChangeType(),一些基本类型如STRING的自动转换都可以实现了,但问题是如果属性为枚举类型的话,直接使用Convert.ChangeType()就会报错了,代码简单描述如下:
————————————————————————————
Type type = typeof(myClass);
PropertyInfo info = type.GetProperty("PropertyName");
if(info.PropertyType.IsEnum)
{
    info.SetValue(需赋值的对象,Convert.ChangeType(数值,info.PropertyType),null);
}public class myClass
{public enum ENUM1 {Enable,Disable};
public enum ENUM2  {Enable,Disable};
public ENUM1 property1
{
get{}
set{}
}
public ENUM2 property2
{
get{}
set{}
}
——————————————————————————————
以上代码中,info.PropertyType可以正确的得出类型名ENUM1 、ENUM2 ,但Convert.ChangeType报错说类型转换无法实现请问有什么办法能实现类似功能呢?实现代码中自动实现类型转换,而不是将每个转换单独写代码希望在回答时能稍微详细点,同时说明下原理最好了,毕竟授人以鱼不如授人以渔,非常感谢!

解决方案 »

  1.   

    http://topic.csdn.net/t/20050324/15/3877926.html
      

  2.   

    http://www.cnblogs.com/flier/archive/2005/02/09/103528.html
      

  3.   

    我以前写过类似一个方法
    private void SetPropertyValue(XmlNode node,Type type,object obj)
    {
    Type cuType = type;//Type.GetType(type);
    object[] paras = new object[node.Attributes.Count];
    for( int att = 0; att< node.Attributes.Count; att ++)
    {
    string attText = node.Attributes[att].InnerText; 
    string attName = node.Attributes[att].LocalName;
    PropertyInfo property = cuType.GetProperty(attName);
    Type attType  = property.PropertyType;
    if(attType.IsEnum)
    {
    object enumObj = Enum.Parse(attType,attText);
    paras[att] = enumObj;
    } else
    paras[att] = Convert.ChangeType(attText,attType);
    }
    for( int att = 0; att< node.Attributes.Count; att ++)
    {  
    object[] ps = new object[1];
    ps[0] = paras[att];
    string attribute = node.Attributes[att].LocalName;
    cuType.InvokeMember(attribute,BindingFlags.SetProperty,null,obj,ps);
    } }
      

  4.   

    如果是枚举 就用
    Enum.Parse
      

  5.   

    info.SetValue(需赋值的对象,Convert.ChangeType(数值,info.PropertyType),null);问一下,这个数值是哪里来的?你怎么确保这个值能转成你所要的enum?
      

  6.   

    byte enumIndex = option.OptionData[0];
    info.SetValue(deveice,Enum.Parse(info.PropertyType,enumIndex.ToString()),null);我好像用着两条语句解决了,感谢daguzhang(MoonWell),不过现在程序还有点小问题,解决完后确认没有疑问了就马上结贴 ^_^TO:danjiewu(阿丹) 
    不是很明白你的意思,我是一开始吧数据装到一个对象中的,同时存有其PropertyName,我只需要针对PropertyName找到特定对象的Property并按PropertyType转换即可,至于PropertyType和数据的对应要在其他地方约定好了如果错了只能说逻辑上的问题了
      

  7.   

    意思就是数值类型是string或者int吗?如果不是的话转不了enum的。
      

  8.   

    哦,你误解我的意思了吧,也许我表述得不是很明白,我并不是要求任意数据之间的相互转换,打个比方:我需要进行多种合法转换,但具体实际实现那种转换需要看接收的数据(假设可以获知该数据类型及需要转换成的类型)而定,这个时候有两种办法实现,一种是用switch判断后找到对应的转换语句(此办法需要把转换语句写死在代码中),还有一种就是我需要的程序根据获取到的该数据类型及需要转换成的类型自行进行转换(主要是针对大量的种类繁多的转换,全写在代码里面比较麻烦)其实我现在也只需要把相应值转换进对象属性里去了,更加通用的东西还没有考虑过