.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
2023/4/15 5:22:01
本文主要是介绍.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程方式。
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(); }
输出如下:
这篇关于.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#