随笔 - 15, 文章 - 0, 评论 - 48, 引用 - 10
数据加载中……

.NET反射的问题,可以算作.NET的bug吗?

        在做项目的时候,定义类时一时疏忽,在子类中重复定义了父类的字段和属性,简化代码如下,实际情况由于子类和父类属性和字段比较多,通过反射从数据库中读取数据并给相应的类赋值的时候,经常出现莫名其妙的错误,明明是A类的Type,使用GetProperty("Type")时候出现异常后,居然得到了B类。程序里面变量的值也都改变了。调试了很长时间才怀疑错误出现在这上面。
        心得:1、不要以为用了new关键字就万事大吉了,有时候这才是噩梦的开始。
         2、反射并不是万能的,也有它处理不了的情况。

using System;
using System.Reflection;

class BaseClass
{
    
private byte m_bytType;
    
public  byte Type
    
{
        
get
        
{
            
return m_bytType;
        }

        
set
        
{
            m_bytType 
= value;
        }

    }

}


class InheritClass : BaseClass
{
    
private int m_intType;
    
public new int Type
    
{
        
get
        
{
            
return m_intType;
        }

        
set
        
{
            m_intType 
= value;
        }

    }

}


class Test
{
    
static void Main()
    
{
        InheritClass clsTest 
= new InheritClass();
        clsTest.Type 
= 3;
        Console.WriteLine(clsTest.Type);
        Type classType 
= clsTest.GetType();
         // 这个位置会抛出异常   
        PropertyInfo prtPropertyinfo 
= classType.GetProperty("Type");
        prtPropertyinfo.SetValue(clsTest,
3000,null);
        
        Console.WriteLine(clsTest.Type);
    }

}

posted on 2004-09-23 19:24 mist 阅读(946) 评论(3)  编辑 收藏 所属分类: C# language

评论

#1楼    回复  引用  查看    

PropertyInfo[] prtPropertyinfos = classType.GetProperties();
prtPropertyinfos[0].SetValue(clsTest, 3000, null);
2004-09-24 09:05 | 大坏蛋      

#2楼    回复  引用  查看    

new 关键字不会导致覆盖,所以Type属性确实是两个,一个是从BaseClass继承而来,另一个是new产生的
2004-09-24 09:08 | 大坏蛋      

#3楼 [楼主]   回复  引用  查看    

最主要的问题是出在.net异常处理上,在我的程序中,try...catch中对sqldatareader操作,读出多条记录,通过反射生成对象的列表(ArrayList),可是碰到上面说的情况时,本应该抛出异常,终止方法的执行,可是实际运行中,catch到exception后,程序又跳到对sqldatareader操作的循环中,而且方法参数改变了值,方法中的变量值也变了,本来对A类发射,突然type变成了这个程序集中的b类。
.net的健壮性还是有待加强!
2004-09-24 09:42 | mist      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-09-24 09:16 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: