淘宝网站图片维护怎么做,wordpress被黑求最安全的国外主机,门户网站建设创新,WordPress mk主题前言
前段时间有朋友问道一个这样的问题#xff0c;.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类#xff0c;然后通过依赖注入#xff08;DI#xff09;的方式获取对应服务的方法并通…前言
前段时间有朋友问道一个这样的问题.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类然后通过依赖注入DI的方式获取对应服务的方法并通过反射动态执行类的方法从而实现更灵活的编程方式。
什么是反射
在 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.AddTransientAdvanceService();
services.AddTransientRetreatService();反射获取所有带有CustomAttribute特性的类并调用对应方法
static void Main(string[] args){var services new ServiceCollection();//注册需要注入的服务services.AddTransientAdvanceService();services.AddTransientRetreatService();var provider services.BuildServiceProvider();#region 反射获取所有带有CustomAttribute特性的类并调用对应方法//反射获取所有带有CustomAttribute特性的类var classes Assembly.GetExecutingAssembly().GetTypes().Where(type type.GetCustomAttributesCustomAttribute().Any());foreach (var clazz in classes){//获取标记CustomAttribute的实例var attr clazz.GetCustomAttributesCustomAttribute().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.GetCustomAttributesCustomAttribute().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);}}}#endregionConsole.ReadLine();}输出如下