.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);

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

示例一:抽象工厂

示例二:

原文地址:https://www.cnblogs.com/hyq/p/1926207.html