澳门新葡新京:入门反射,完成数据库访问类反射封装

那篇来看一下反光的行使!举例!

反射是.NET中的主要机制,通过反射,能够在运行时获得程序或程序集中每种等级次序(富含类、结构、委托、接口和枚举等)的积极分子和成员的新闻。有了反光,就能够对每二个体系胸有成竹。其余笔者还能直接创立对象,即便那个指标的档期的顺序在编写翻译时还不知底。 
    
反射的用途:
    (1)使用Assembly定义和加载程序集,加载在前后相继集清单中列出模块,以至现在程序集中查找类型并创制该品种的实例。 
    (2)使用Module明白富含模块的次第集以致模块中的类等,还能够得到在模块上定义的具备全局方法或其余特定的非全局方法。 
    (3)使用ConstructorInfo了然构造函数的名号、参数、访谈修饰符(如pulic 或private)和兑现详细音讯(如abstract或virtual)等。 
    (4)使用MethodInfo精通方法的名目、重返类型、参数、访谈修饰符(如pulic 或private)和兑现详细消息(如abstract或virtual)等。
    (5)使用FiedInfo领悟字段的名号、访谈修饰符(如public或private)和落实详细音讯(如static)等,并收获或安装字段值。
    (6)使用伊夫ntInfo精晓事件的称谓、事件管理程序数据类型、自定义属性、评释类型和反光类型等,加多或移除事件管理程序。 
    (7)使用PropertyInfo明白属性的名称、数据类型、证明类型、反射类型和只读或可写状态等,获取或安装属性值。 
    (8)使用ParameterInfo了然参数的名称、数据类型、是输入参数还是出口参数,以至参数在点子具名中的地方等。

澳门新葡新京 1

反射用到的命名空间:     System.Reflection
    System.Type
    System.Reflection.Assembly
    
反射用到的最主要类:
    System.Type 类--通过那几个类能够访谈任何给定数据类型的新闻。
   
System.Reflection.Assembly类--它能够用来访谈给定程序集的音讯,或许把这些程序集加载到程序中。
    
System.Type类:
    System.Type 类对于反射起着主导的功效。但它是叁个浮泛的基类,Type有与每个数据类型对应的派生类,大家接纳这些派生类的目的的办法、字段、属性来寻找有关该品种的富有音信。
    获取给定类型的Type引用有3种常用格局:
    ●使用 C# typeof 运算符。
        Type t = typeof(string);
    ●使用对象GetType()方法。
        string s = “grayworm”;
        Type t = s.GetType();
 
    ●还是能够调用Type类的静态方法GetType()。
        Type t = Type.GetType(“System.String”);
       
    上边那三类代码都以获得string类型的Type,在抽取string类型的Type援用t后,大家就足以因而t来探测string类型的布局了。 
            string n = “grayworm”;
            Type t = n.GetType();
            foreach (MemberInfo mi in t.GetMembers())
            {
                Console.WriteLine(“{0}/t{1}”,mi.MemberType,mi.Name);
            }
    
    Type类的质量:         Name 数据类型名
        FullName 数据类型的一点一滴限定名(包蕴取名空间名)
        Namespace 定义数据类型的命名空间名
        IsAbstract 提示该项目是或不是是抽象类型
        IsArray   提示该项目是不是是数组
        IsClass   提示该类型是不是是类
        IsEnum   提醒该类型是不是是枚举
        IsInterface    提示该品种是不是是接口
        IsPublic 提示该项目是或不是是公有的
        IsSealed 提醒该项目是不是是密封类
        IsValueType 提示该类型是不是是值类型
    Type类的主意:         GetConstructor(),
GetConstructors():重返ConstructorInfo类型,用于获取该类的构造函数的新闻
        Get伊芙nt(), GetEvents():再次回到伊芙ntInfo类型,用于获取该类的风云的新闻
        Get菲尔德(), GetFields():重返FieldInfo类型,用于获取该类的字段(成员变量)的音信
        GetInterface(), GetInterfaces():再次来到InterfaceInfo类型,用于获取该类达成的接口的音讯
        GetMember(), GetMembers():重返MemberInfo类型,用于获取该类的兼具成员的新闻
        GetMethod(), GetMethods():再次来到MethodInfo类型,用于获取该类的艺术的音讯
        GetProperty(), GetProperties():再次来到PropertyInfo类型,用于获取该类的特性的新闻
    能够调用这个成员,其方法是调用Type的InvokeMember()方法,只怕调用MethodInfo,
PropertyInfo和别的类的Invoke()方法。 
    
    查看类中的构造方法:
        NewClassw nc = new NewClassw();
        Type t = nc.GetType();         ConstructorInfo[] ci = t.GetConstructors();   
//获取类的具有构造函数
        foreach (ConstructorInfo c in ci) //遍历每贰个构造函数
        {
            ParameterInfo[] ps = c.GetParameters();   
//收取种种构造函数的兼具参数
            foreach (ParameterInfo pi in ps)  
//遍历并打字与印刷所该构造函数的全部参数
            {
                Console.Write(pi.ParameterType.ToString()+”
“+pi.Name+”,”);
            }
            Console.WriteLine();
        }
    
    用构造函数动态变化对象:         Type t =
typeof(NewClassw);
        Type[] pt = new Type[2];         pt[0] = typeof(string);
        pt[1] = typeof(string);
        //根据参数类型获取构造函数 
        ConstructorInfo ci = t.GetConstructor(pt);          //构造Object数组,作为构造函数的输入参数 
        object[] obj = new
object[2]{“grayworm”,”hi.baidu.com/grayworm”};
   
        //调用构造函数生成对象 
        object o = ci.Invoke(obj);             //调用生成的对象的形式测量检验是或不是对象生成成功 
        //((NewClassw)o).show();    
    
    用Activator生成对象:         Type t =
typeof(NewClassw);
        //构造函数的参数 
        object[] obj = new object[2] { “grayworm”,
“hi.baidu.com/grayworm” };   
        //用Activator的CreateInstance静态方法,生成新对象 
        object o =
Activator.CreateInstance(t,”grayworm”,”hi.baidu.com/grayworm”);
          //((NewClassw)o).show();

譬如子,确定须要贰个类,先建二个上学的小孩子类:

    查看类中的属性:         NewClassw nc =
new NewClassw();
        Type t = nc.GetType();
        PropertyInfo[] pis = t.GetProperties();         foreach(PropertyInfo pi in pis)
        {
            Console.WriteLine(pi.Name);
        }
    
    查看类中的public方法:         NewClassw nc =
new NewClassw();
        Type t = nc.GetType();
        MethodInfo[] mis = t.GetMethods();         foreach (MethodInfo mi in mis)
        {
            Console.WriteLine(mi.ReturnType+” “+mi.Name);
        }
    
    查看类中的public字段         NewClassw nc =
new NewClassw();
        Type t = nc.GetType();
        FieldInfo[] fis = t.GetFields();
        foreach (FieldInfo fi in fis)
        {
            Console.WriteLine(fi.Name);
        } ()
       
    用反射生成对象,并调用属性、方法和字段实行操作          NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        object obj = Activator.CreateInstance(t);
        //取得ID字段 
        FieldInfo fi = t.GetField(“ID”);
        //给ID字段赋值 
        fi.SetValue(obj, “k001”);
        //取得MyName属性 
        PropertyInfo pi1 = t.GetProperty(“MyName”);
        //给MyName属性赋值 
        pi1.SetValue(obj, “grayworm”, null);
        PropertyInfo pi2 = t.GetProperty(“MyInfo”);
        pi2.SetValue(obj, “hi.baidu.com/grayworm”, null);
        //取得show方法 
        MethodInfo mi = t.GetMethod(“show”);
        //调用show方法 
        mi.Invoke(obj, null);
        
System.Reflection.Assembly类 
    
Assembly类能够收获程序集的音信,也能够动态的加载程序集,以至在先后集中查找类型音讯,并创造该品种的实例。
    使用Assembly类能够减低程序集以内的耦合,有助于软件结构的合物理和化学。
    
    透进程序集名称再次来到Assembly对象
        Assembly ass = Assembly.Load(“ClassLibrary831”);
    通过DLL文件名称重返Assembly对象
        Assembly ass = Assembly.LoadFrom(“ClassLibrary831.dll”);
    通过Assembly获取程序聚焦类
 
        Type t = ass.GetType(“ClassLibrary831.NewClass”);  
//参数必须是类的真名
    通过Assembly获取程序聚集具备的类
        Type[] t = ass.GetTypes();
       
    //通进程序集的称号反射     Assembly ass =
Assembly.Load(“ClassLibrary831”);
    Type t = ass.GetType(“ClassLibrary831.NewClass”);
    object o = Activator.CreateInstance(t,
“grayworm”, “”);
    MethodInfo mi = t.GetMethod(“show”);
    mi.Invoke(o,
null);

public class Student
{
  public int Status;
    public int Id { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }

    public void Show()
    {
       Console.WriteLine("姓名:{0}", Name);
    }
}

   //通过DLL文件全名反射此中的具有品种
    Assembly assembly =
Assembly.LoadFrom(“xxx.dll的路径”);
    Type[] aa = a.GetTypes();

四个天性,Id,Name,Sex。三个字段Status,贰个措施Show.

   
foreach(Type t in aa)
    {
        if(t.FullName == “a.b.c”)
        {
            object o = Activator.CreateInstance(t);
        }
    }

嗯~,破费科特。

 

来探访反射的种种艺术或性质怎样运用!

收获项目标公用属性的章程(GetProperties)

Type t = typeof(Student);    //获取类型
PropertyInfo[] pro = t.GetProperties();//获取公用属性
foreach (var p in pro)
    Console.WriteLine(p.Name);//输出属性名称

出口结果为:

Id
Name
Sex

GetProperties能够收获项目中享有的公用属性,再次回到壹脾品质消息数组PropertyInfo(类型中的公用属性>=
0 ,用数组),

重临三个性能消息数组,大家循环输出了它公用属性的称谓。

获得具备公用字段字段(Get菲尔德s)

Type t = typeof(Student);//获取类型
FieldInfo[] fields = t.GetFields(); //获取所有公用字段
foreach (var f in fields)
    Console.WriteLine(f.Name);//输出

 输出结果为:

Status

Student里的公用字段Status输出了。

GetFields能够拿走项目中持有的公用字段,重返的是五个字段音讯数组(类型中的公用字段>=0的,用数组),然后大家把这些数组进行巡回输出。

获得所公用方法(GetMethods)

Type type = typeof(Student);//获取类型
MethodInfo[] methods = type.GetMethods();//获取所有公用方法
foreach (var m in methods)
  Console.WriteLine(m.Name);//输出方法名

输出结果为:

get_Id
set_Id
get_Name
set_Name
get_Sex
set_Sex
Show

GetMethods能够得到项目中具备的公用方法,再次回到叁个主意新闻数组(MethodInfo[]),大家循环输出公用方法的称谓。

不只输出了Show公用方法,还输出了public
类型 字段名{ get; set; }中的get与set的公用方法。

GetProperty寻觅内定名称的公用属性,SetValue设置钦点对象的属性值

Student stu = new Student();//实例化一个Student
Type type = stu.GetType();  //获取Student的类型
PropertyInfo pro = type.GetProperty("Name");//搜索Student里名称为Name的公用属性
pro.SetValue(stu,"小明"); //设置stu里公用属性Name为"小明"
stu.Show(); //调用stu.Show()方法

出口结果为:

姓名:小明

╭(╯^╰)╮,你会发觉本人并未经过stu对这些Name属性赋值,就张开输出,输出内容突显Name已经被赋值了。

那都以拜GetProperty与SetValue所赐。

PropertyInfo pro = 类型.GetProperty(属性名);

type.GetProperty(“Name”)能够寻找类型里名叫Name的公用属性,重返六性格能音信类
“PropertyInfo “(搜索结果是十足的,不行使数组)

属性信息.SetValue("对象实例", "值" );

pro.SetValue(stu,”小明”);可以安装stu对象中名为“Name”的质量音讯(pro)值。

此间设置为”小明”,还亟需传贰个对象实例,因为您要钦定是哪八个实例,不钦定的话怎么能明白你改改的是哪四个实例中的Name属性值呢。

GetMethod搜索内定名称的公用方法与Inovke使用内定参数调用当前实例所表示的章程

将那个从前大家先给Student加点东西

 public class Student
 {
     public int Status;
     public int Id { get; set; }
     public string Name { get; set; }
     public string Sex { get; set; }

     public void Show()
     {
        Console.WriteLine("姓名:{0}", Name);
     }

      //新加入
      public void Show(int id, string name, string sex)
      {
         Console.WriteLine("Id:{0},Name:{1},Sex:{2}", id,name,sex);
      }
}

咱俩重载了二个新的Show方法,多了两个参数。

加完方法后,大家来钻探商量这么些GetMethod与Invoke

上代码:

Student stu = new Student();
Type type = stu.GetType();
MethodInfo me = type.GetMethod("Show");//搜索stu对象里名称为Show的公用方法
me.Invoke(stu,new object[] { 1,"小明","男"});//调用新加入的Show,传入三个参数分别对应方法的三个参数

先获得stu的连串然后利用GetMethod来索求名称叫”Show”的公用方法。

最后来调用stu里名叫”Show”的法子,何况传入多少个参数(无参数传入null,有参数字传送入object[]数组)

编制程序进度十一分如愿,可是运维时报错!

内心是崩溃的!

澳门新葡新京 2

 

澳门新葡新京 3

留心想了想,发掘寻找的时候好像就索求错误了。重载了叁个八个参数的法子,大家好像搜索成无参数的办法了。

有参数的秘籍该怎么寻找呢?

通过各类询问与商量后,开采了GetMethod的另四个重载。

Student stu = new Student();
Type type = stu.GetType();
Type[] types = new Type[] { typeof(int), typeof(string), typeof(string) };//一个Type数组
MethodInfo me = type.GetMethod("Show", types);//搜索stu对象里名称为Show的公用方法
me.Invoke(stu,new object[] { 1,"小明","男"});

咱俩新建了多个Type[]数组,然后定义了int,string,string四个档案的次序,然后将它传给了GetMethod方法。

黑马开掘成功了。大家在GetMethod中传出了五个门类数组,规定了追寻方法的参数类型。所以基于那个类型GetMethod就会活动搜索到咱们新重载的方法了。

Id:1,Name:小明,Sex:男

澳门新葡新京 4

果不其然不出作者所料   ~。~!

总结:

读书反射的大运少之又少,在书上找到反射的知识点也相当少,在新浪,csdn,各类贴吧找到的文化了解了下,就写了几篇博客记录一下。

可能是反射已经不复被日常应用,也许他的习性略差被交流,也许她的留存位于框架非常多,不过他着实是一个不行又去况且令人存有思考的东西。

在放学疏才浅,错误在所无免,倘诺有错误请各位大佬提出。感谢!

澳门新葡新京 5

相关文章