zoukankan      html  css  js  c++  java
  • .NET基础回顾反射

    本文摘要

    1、反射基础概念
    2、反射的一般用途
    3、反射的前期准备与铺垫:类型信息Type
    4、反射代码示例-实际应用

    一、基础概念

    反射提供了描述程序集、模块和类型的对象,可以使用反射动态创建类型的实例,将类型绑定到现有的对象,或者从现有的对象获取类型并调用其方法或者访问其字段和属性。

    二、反射的一般用途

    1、.使用Assembly定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

    2、使用Module发现以下信息:包含模块的程序集以及模块中的类等,获取在模块上定义的全局方法或者其他特定的非全局方法。

    3、使用ConstructorInfo发现:构造函数的名称、参数、参数访问符和实现详细信息,使用Type的GetConstructors或者GetConstructor方法来调用特定的构造函数。

    4、使用MethodInfo发现:方法的名称、参数、返回类型、访问修饰符和实现信息,使用Type的GetMethods或者GetMethod方法调用特定的方法。

    5、使用FieldInfo发现:字段的名称、访问修饰符、和实现详细信息,并获取或者设置字段的值。

    6、使用EventInfo发现:事件的名称、事件处理程序的数据类型、自定义属性、声明类型和反射类型,添加或者移除事件处理程序。

    7、使用PropertyInfo发现:属性的名称、数据类型、声明类型、反射类型和只读或者可写状态信息,并获取或者设置属性值。

    8、使用ParameterInfo发现:参数的名称、数据类型、声明类型、反射类型或者是输入参数还是输出参数,以及参数在方法签名中的位置。

    9、获取自定义Attribute节点的信息

    三、反射的前期准备与铺垫:类型信息Type

    System.Type类对于反射起着非常核心的作用。当反射请求加载的类型时,公共语言运行库将自动创建一个Type,我们就是用Type对象的方法、字段、属性和嵌套类来查找该类型的所有信息。

    Type类表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开放或者封闭构造的泛型类型。

    Type是System.Reflection功能的根,也是访问元数据的主要方式。

    获得某种类型关联的Type对象的方式:

    辅助类:

    using System;
    using System.Reflection;
    namespace CSharp.ReflectionDemo
    {
        public interface ICustonType
        {
            void TestMethod();
        }
    
        public class CustomType : ICustonType
        {
            public void TestMethod()
            {
                throw new NotImplementedException();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                
            }
        }
    }

    1、.NET所有的对象都继承与System.Object,通过公共方法GetType获取当前实例的Type

    CustomType customType=new CustomType();
    Type type = customType.GetType();
    Console.WriteLine(type.FullName);

    2、静态 GetType 方法返回 Type 对象,该对象表示由其完全限定名指定的类型。

    Type type2 = Type.GetType("CSharp.ReflectionDemo.CustomType");
    Console.WriteLine(type2.FullName);

    3、Module.GetTypes、Module.GetType 和 Module.FindTypes方法返回 Type 对象

    Module module = typeof (CustomType).Module;
    Type type3 = module.GetType();
    Console.WriteLine(type3.FullName);
    Type[] types4 = module.GetTypes();
    foreach (Type temp in types4)
    {
      Console.WriteLine(temp.FullName);
    }

    4、FindInterfaces

    5、GetElementType

    Type type5 = customType.GetType();
    Type type6 = type5.GetElementType();

    6、GetInterfaces 和 GetInterface

    Type type7 = type5.GetInterface("ICustonType");
    Type[] types8 = type5.GetInterfaces();
    foreach (Type temp2 in types8)
    {
      Console.WriteLine(temp2.FullName);
    }
    Console.WriteLine(type7.FullName);

    7、GetTypeArray:获取指定数组中Type类型

    object[] myobject=new object[3];
    myobject[0] = 68;
    myobject[1] = "M9";
    myobject[2] = new CustomType();
    Type[] types9 = Type.GetTypeArray(myobject);
    foreach (Type temp in types9)
    {
      Console.WriteLine(temp.FullName);
    }

    8、typeof运算符

    Type type10 = typeof (CustomType);
    Console.WriteLine(type10.FullName);

    四、反射代码示例-实际应用

    示例一:抽象工厂

    示例二:

  • 相关阅读:
    ERROR 000732:Output Geodatabase:Dataset Database ConnectionsConnection to localhost.sdeSDE.Dataset does not exist or is not supported
    【转】通过 INotifyPropertyChanged 实现观察者模式
    Fatal NI connect error 6413的解决办法 http://www.itpub.net/thread-107518-1-1.html
    Oracle impdp的ignore及 fromuser / touser 功能
    进度条插件使用demo
    两个div并列居中显示——当display:inline-block;时,两个div无法对齐即一高一矮
    两个div并列居中显示——当display:inline;时,div的宽高不起作用即两个div重叠显示
    轮播插件unslider.min.js使用demo
    WEB网页如何让背景图片跟随可视窗口自适应大小
    火狐浏览器不支持location.reload()(以改变页面大小时重新刷新页面为例)
  • 原文地址:https://www.cnblogs.com/hyq/p/1926207.html
Copyright © 2011-2022 走看看