代码改变世界

利用反射技术创建只包含私有无参构造函数的对象实例

2005-11-09 05:26  晓风残月  阅读(...)  评论(...编辑  收藏
呵呵,非常努力终于发了第一帖了.......

反射(reflection)简介:
        反射是.NET架构的内建技术,通过 reflection,我们可以动态创建类的实例,可以是本地或是远程对象,或者获取对远程对象的引用。不仅如此,利用反射技术可以获取某个程序级所有类的列表,以及每个类中的所有方法和属性,还可以获得某个对象中所有实例变量列表,并且允许我们获取或者更改这些变量(包括私有变量)。

        反射功能是如此的强大了,以至于是非常的危险,因为他可以打破对象的封装性(面向对象三大特性之一)。在我还没有认识到 reflection的强大功能时,我不禁想:这简直是 MS 给我们预留的“后门”,是.net framework的一打 bug。然而,事实上,她又是如此讨人喜欢,如果没有她,一些系统可能无法实现。据我所知, nhibernate(一个从hibernate移植到.net平台的ORM工具)当中久用了大量的反射技术,比如,nhibernate 的映射列可以是 实体类的 私有字段和私有属性。

反射的常用功能,我就不罗嗦了(但是也是唠叨了这么多,呵呵。。。),我想说的是大家可能不易发现的一点:利用反射技术创建只包含私有无参构造函数的对象实例
只包含私有无参构造函数的 Book 类:
using System;

namespace MyCompany.MyApp.BizEntity
{
    
public class Book 
    
{
        
ctor(s)        

        
private System.String _Name;
        
public System.String Name
        
{
             
get return _Name; }
            
set { _Name = value; }
        }


        
private System.String _Author;
        
public System.String Author
        
{
             
get return _Author; }
            
set { _Author = value; }
        }
        
    }
//class Book 
}
//namespace MyCompany.MyApp.BizEntity

测试代码:
using System;
using System.Reflection;

namespace MyCompany.MyApp.BizEntity
{
    
public class Fixture
    
{
        
public void Main()
        
{
            Book book;
            
//book = new Book();    //编译错误
            book = (Book)Activator.CreateInstance( typeof(Book), true );    //编译成功            
        }

    }
//class Texfiur
}
//namespace MyCompany.MyApp.BizEntity

非常遗憾的是这个“后门”也不是很”完美“,因为这个私有构造函数是不能包含任何参数的。不过,一般私有构造函数应用在包含在只包含静态属性和静态方法的类中,以防止 用户 通过 new 操作创建类的实例,因此私有构造函数一般也是无惨的。