RT,什么是反射机制和ORM机制?在项目中应用在什么地方?如何应用?
有什么好处?
请详细讲讲~如有什么好的简单易懂的资料也可以推荐看看。小生在此先谢谢大家了!

解决方案 »

  1.   

    程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途: 
      1.使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 
      2.使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 
      3.使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。
      4.使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。 
      5.使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。 
      6.使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。 
      7.使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。 
      8.使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。 
      9.使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
      

  2.   

    给你举个Linq to SQL应用的例子:假设要查询一个LogName=="1234"的User对象,并且将他的Email修改一下,并保存,就可以写代码:using(var dbt=new DataContext(this.connectionString))
    {
    var u=dbt.GetTable<User>().Where(u=>u.LogName=="1234").First();
    u.Email="[email protected]";
    dbt.SubmitChanges();
    }这样,Linq to SQL可以处理任意自定义类型。我只需要手写这个User类型上的Attribute声明:    [Table]
        public class User
        {
            private static Random Rnd = new Random();        private long _ID = long.MinValue;        [Column(IsPrimaryKey=true)]
            public long ID
            {
                get
                {
                    if (_ID == long.MinValue)
                        _ID = (long)Rnd.Next() + DateTime.Now.Ticks;
                    return _ID;
                }
                set { _ID = value; }
            }        private string _LogName;        [Column(DbType="nvarchar(40) NOT NULL")]
            public string LogName
            {
                get { return _LogName; }
                set { _LogName = value; }
            }        [Column(DbType = "varbinary(32) NULL")]
            private byte[] PasswordMD5 { set; get; }        private string _EMail;        [Column(DbType = "nvarchar(100) NOT NULL")]
            public string EMail
            {
                get { return _EMail; }
                set { _EMail = value; }
            }        [Column(DbType = "bit NOT NULL")]
            public bool DenyLogin { get; set; }
    尽管大多数Linq to SQL的网上教程都教你在vs环境帮助下自动产生 .dbml 文件并自动产生相应的从 DataContext继承的数据源对象的方法,其实根本不需要,像这样仅仅在自定义的实体对象上定义相应的Attribute就可以使用Linq to SQL直接访问数据库了。Linq to SQL框架设计开发在先,然后你才使用它来编写你的数据库应用程序。这就是最关键的需求——对象的类型、属性等等都是在开发框架时预先不知道、无法想当然地用接口或者抽象class来假设的,但是你只要通知Linq to SQL,它就能解析并执行相应的功能。
      

  3.   

    写出增加、删除的demo:using(var dbt=new DataContext(this.connectionString))
    {
        var u=new User{LogName="张三",Email="张三@1234.com"};
        var u=dbt.GetTable<User>().InsertOnSubmit(u);
        dbt.SubmitChanges();
    }using(var dbt=new DataContext(this.connectionString))
    {
        var table=dbt.GetTable<User>();
        var u=table.Where(u=>u.LogName=="1234").First();  //删除1234这个用户
        table.DeleteOnSubmit(u);
        dbt.SubmitChanges();
    }
      

  4.   

    var u=dbt.GetTable<User>().InsertOnSubmit(u);应该写为dbt.GetTable<User>().InsertOnSubmit(u);
    我们看到还有很多人(大多数csdn上的人)在使用 “new SqlConnection”、“cmd.Execute.....”之类的代码,一些喜欢抽象、通用化的人使用DBConnection、DBCommand或者是IDbConnection、IDbCommand之类接口。当切换数据库时其实SQL还是要逐一修改、调试。这些人的做法还没有进入Linq操作数据库的门槛,还停留在操作数据库的原始阶段。网上有个开源项目 DLinq,她可以使用Linq provider处理许多种数据库,所有数据库的Linq接口都是通用的 DbLinq.Data.Linq.DataContext 继承来的,所以所有这些数据库操作方法都有同样的抽象类型,切换不同数据库时你编写的代码几乎从不用改变,因此也就几乎从来不用调试就能保证质量。
      

  5.   

    嗯,那个开源项目是DBLinq,少写了一个字母。
      

  6.   

    使用反射时,通常仅仅反射一次,然后就将反射出来的各种对象保存(缓存)在static变量中,甚至将反射出来的Method转换为Delegate(因为执行delegate要比执行method.Invoke快很多)。如果不注意这个,那么反射程序就真的执行很慢了。如果注意了这个,那么尽管反射代码比非反射代码慢1000倍,但是对你的应用程序的运行速度几乎不会产生任何影响,而又具有强大灵活的“看似万能”的功能。
      

  7.   

    我对于 ORM 的接口定义是这样的using System;
    using System.Linq;namespace WuweiCommon
    {
        public interface IDomain : IDisposable
        {
            IQueryable<T> Cast<T>() where T : class;
            void Insert<T>(T obj) where T : class;
            void Update<T>(T obj) where T : class;
            void Delete<T>(T obj) where T : class;
            void Commit();
        }
    }
    例如写:            using (var dt = WuweiCommon.Extensions.GetDALInstance ())
                {
                    var tm = dt.Cast<Team>().First(t => t.Name == TeamName);
                    tm.Name = Team.Name;
                    dt.Insert(tm);
                    dt.Commit();
                }
    当Commit()没有执行(例如抛出异常时),IDisposable.Dispose方法的实现会回滚数据库事务。而WuweiCommon.Extensions.GetDALInstance方法则是从应用程序的配置文件(app.config或者web.config文件等)来反射获取IDomain的具体实现类型(和对象)。我实现了超过7、8种IDomain作为产品的基础(临时实现的不算),从面向.net内存集合变量,到4种关系数据库、1种面向对象数据库、xml文件、以及一个大厂家提供的相当变态的远程访问api,都集成在同一个接口之下。
      

  8.   

    同时,IDomain的设计还包括相关的触发器类。数据库操作被夸张得特别神奇,编写数据库程序对于许多人来说似乎是高级的技术,其实不过也就是IDomain这几个操作而已,对于我(以及我的团队)来说应该说是没有什么技术含量的低级编程技术。
      

  9.   

    先学c#语法。在学petshop
    然后学orm框架
      

  10.   

    看NHibernate的资历,它就是一种ORM。 你也可以用Linq to SQL自己写mapping file。