.NET 中的反射

反射概念

反射提供封装程序集、模块和类型的对象。

反射技术主要基于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}");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值