经常听人说反射,自己也用过反射工厂,不过都是做做换数据库之类的事情.
想问一下,反射在解决哪些问题的时候用的很普遍,最好能举出实际的例子,
谢谢各位了.....

解决方案 »

  1.   

    例如说,所有发票都有一个统一的“发票号”,但是如何通过发票号获得具体类型的发票对象呢?代码:  发票 p=Factory.Select("京A-1290");
      p.审核();可能得到一个类型为“摆地摊专用发票”(我杜撰的)的对象,这个类型是从发票继承的,换一个发票号可能就返回另一个类型的发票对象,他们都多态地使用发票的“审核”方法定义。
      

  2.   

    再举一个的例子:using (DbConnection cnn = NewConn())
    {
        DbDataAdapter adp = getTableAdapter(tableName);
        DbCommand cmd = adp.SelectCommand;
        cmd.Connection = cnn;
        DbParameter prm = DBFactory.CreateParameter();
        prm.ParameterName = "@id";
        prm.Value = Guid.Empty;
        cmd.Parameters.Add(prm);
        adp.Fill(_Cache2, tableName);
    }这个代码不论你使用什么数据库:Access、SQL Server、Oracle、FoxPro、SQLite等都可以使用,因为他们都有ADO.NET兼容的子类定义。通过在NewConn和DBFactory上切换为另外一种数据库,程序就移植到异种数据库上了,你的程序逻辑不需要修改,维护也极其方便。是否使用抽象和多态,是一个设计问题,没有经验的人会用最低级的类型去描述逻辑,似乎这样性能最高,而不去抽象。最后在说明一下反射。例如那个发票工厂方法,在一个数据库表中或者文件中保存发票号所对应的对象的AssemblyName和TypeFullName(例如数据库字段类型是NVarchar(100)),代码中就可以动态创建具体类型的对象。写那个程序的时候是要对“所有发票”一网打尽,设计程序的时候甚至还没有开发大部分具体的发票类型,具体的类型是在程序开发之后“将来”才扩展的,所以只能动态创建具体类型的对象。
      

  3.   

    举个DBFactory的实现例子:        static private DbProviderFactory DBFactory
            {
                get
                {
                    return new System.Data.SqlClient.SqlClientFactory();
                }
            }切换为其他的数据库很容易,而程序的核心逻辑都是按照ADO.NET帮我们抽象出来的高层次类型去书写,例如DbDataAdapter、DbCommand 、DbParameter 等,因此具有稳固性和扩展性。
      

  4.   

    哦,上面的 DBFactory举的例子是从多态的角度。如果进一步就要用到反射,return后边是用System.Reflection.Assembly.Load(....).GetType(....).CreateInstance()就可以更加动态地创建对象了。