前言
C#中反射指的是什么?
在 C# 中,反射是指在运行时动态地获取类型的信息并操作对象的能力。使用反射,我们可以在代码中访问程序集、模块、成员等,并且可以操作这些成员的属性、方法、字段和事件等。
自定义一个Attribute类型
/// <summary> /// 自定义一个Attribute类型 /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = false] public class CustomAttribute : Attribute { public string TargetMethod { get; set; } public CustomAttribute(string targetMethod { TargetMethod = targetMethod; } }
定义如下两个需要被执行的服务,并使用CustomAttribute标记
/// <summary> /// 前进服务 /// </summary> [Custom("AdvanceWay"] public class AdvanceService { public void AdvanceWay( { Console.WriteLine("On the move!"; } } /// <summary> /// 后退服务 /// </summary> [Custom("RetreatWay"] public class RetreatService { public void RetreatWay( { Console.WriteLine("Be retreating!"; } }
注册需要注入的服务
var services = new ServiceCollection(; //注册需要注入的服务 services.AddTransient<AdvanceService>(; services.AddTransient<RetreatService>(;
反射获取所有带有CustomAttribute特性的类并调用对应方法
static void Main(string[] args { var services = new ServiceCollection(; //注册需要注入的服务 services.AddTransient<AdvanceService>(; services.AddTransient<RetreatService>(; var provider = services.BuildServiceProvider(; #region 反射获取所有带有CustomAttribute特性的类并调用对应方法 //反射获取所有带有CustomAttribute特性的类 var classes = Assembly.GetExecutingAssembly(.GetTypes( .Where(type => type.GetCustomAttributes<CustomAttribute>(.Any(; foreach (var clazz in classes { //获取标记CustomAttribute的实例 var attr = clazz.GetCustomAttributes<CustomAttribute>(.First(; //根据CustomAttribute元数据信息调用对应的方法 var methodInfo = clazz.GetMethod(attr.TargetMethod; if (methodInfo != null { //instance 对象是通过依赖注入容器获取的。这是一种常用的实现方式,可以使用依赖注入解耦程序中各个组件之间的依赖关系,方便测试和维护。 var instance = provider.GetService(clazz; methodInfo.Invoke(instance, null; } } #endregion #region 反射获取所有带有CustomAttribute特性的类并调用指定方法 var executionMethod = "RetreatWay"; foreach (var clazz in classes { //获取标记CustomAttribute的实例 var attr = clazz.GetCustomAttributes<CustomAttribute>(.First(; if (attr.TargetMethod == executionMethod { //根据CustomAttribute元数据信息调用对应的方法 var methodInfo = clazz.GetMethod(attr.TargetMethod; if (methodInfo != null { //instance 对象是通过依赖注入容器获取的。这是一种常用的实现方式,可以使用依赖注入解耦程序中各个组件之间的依赖关系,方便测试和维护。 var instance = provider.GetService(clazz; methodInfo.Invoke(instance, null; } } } #endregion Console.ReadLine(; }
输出如下: