反射概念
反射提供封装程序集、模块和类型的对象。
反射技术主要基于System.Reflection 命名空间中的类与 System.Type 。
反射用途简单来说就是获取有关程序集中的类型信息。
可以使用反射动态地创建类的实例,将类型绑定到现有的对象,或从现有的对象中获取类型,然后调用其方法、字段或属性。
反射的典型用法:
- Assembly 来定义和加载程序集。加载程序集清单中的模块、获取类型、创建实例。
- Module 主要是发现模块中的类。
- ConstructorInfo 主要是发现构造函数信息。使用Type的 GetConstructors 或 GetConstructor 方法来调用特定构造函数。
- MethodInfo 主要是发现方法的实现详细信息。使用Type的 GetMethods 或 GetMethod 方法来调用特定方法。
- FieldInfo 主要是获取和设置字段值。
- EventInfo 主要是添加和删除事件处理程序。
- PropertyInfo 主要是获取和设置属性值。
- ParameterInfo 主要是获取参数的名称、数据类型以及参数在方法签名中的位置。
- CustomAttributeData 主要是获取自定义特性的信息。
动态读取dll
- Load: dll名称不需要后缀。
- LoadFrom: dll全名称,需要后缀。
- LoadFile: 全路径,需要dll后缀。
举例:
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
//加载dll程序集
Assembly assembly = Assembly.Load("DbHelper");
//获取类型、参数(命名空间名称.类名称)
Type type = assembly.GetType("DbHelper.SqlHelper");
//创建实例(命名空间名称.类名称)
var instance = assembly.CreateInstance("DbHelper.SqlHelper");
//获取指定方法
MethodInfo methodInfo = type.GetMethod("GetSqlServerName");
//传入参数
var obj = new object[] { "Mike" };
//调用方法(实例,参数)
methodInfo.Invoke(instance, obj);
Console.ReadKey();
}
}
}
//DbHelper.dll文件生成路径指定到ConsoleApp1程序的bin目录,否则引用失败。
namespace DbHelper
{
public class SqlHelper
{
public void GetSqlServerName(string name)
{
Console.WriteLine($"Name:{name}");
}
}
}