.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元数据信息调用对应的方法的更多相关文章
- .NET Core 反射获取所有控制器及方法上特定标签
.NET Core 反射获取所有控制器及方法上特定标签 有个需求,就是在. NET Core中,我们想在项目 启动时,获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方,把 ...
- ASP.NET Core中使用自定义MVC过滤器属性的依赖注入
除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 反射获取属性DisplayName特性名字以及属性值
/// <summary> /// 反射获取所有DisplayName标记值 /// </summary> /// <typeparam name="T&quo ...
- Java反射获取当前项目下所有类,支持Servlet
反射在很多时候要用,尤其自己编写框架时,那么如何获得当前项目下所有类呢!以下是本人封装的一个比较简洁的方法: [功能代码] //通过loader加载所有类 private List<Class& ...
- java中使用反射获取pojo(实体)类的全部字段值
说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...
- java中使用反射获取pojo(实体)类的所有字段值
出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...
- 循序渐进学.Net Core Web Api开发系列【11】:依赖注入
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- 关于TagHelper的那些事情——自定义TagHelper(格式化输出、依赖注入使用)
自定义TagHelper的最后一步就是在Process方法或ProcessAsync方法中添加展现代码.熟悉WebControl开发的朋友都知道Render方法,在这个方法中会添加展现的Html元素和 ...
随机推荐
- FCC 高级算法题 收银机找零钱
Exact Change 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) ...
- Java swing图形界面计算器
效果图如下所示 : import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Gr ...
- jquery的ajax方法获取不到return返回值
/** 2 * 方式:(1)同步调用 (2)在ajax函数中return值 3 * 结果:返回 1.未成功获取返回值 4 * 失败原因:ajax内部是一个或多个定义的函数,ajax中return返回值 ...
- C++ || 求一个数中1的位数
点击查看代码 #include<iostream> using namespace std; int f(int x) { int count = 0; while(x) { if (x ...
- springboot项目导出excel实现
参见:https://blog.csdn.net/duli_0105/article/details/102809936
- MQ(创建MQ注意事项)
创建MQ队列管理器时,需要注意的事项包括以下几点: 1) 队列管理器的日志类型以及日志文件的大小和个数,要根据用户数据量的大小.各个队列上的消息总容量,来计算日志的总容量,以免在系统运行过程中出现日志 ...
- 记我的第一个UVM项目
没有天天写博客的习惯,后果就是老是忘记自己的排版风格.为了追求统一还要翻一下之前是怎么写的.这也算是意料之外的发现吧. 说实话,没人教的话从零开始学一个新的东西实在是太难了.即使互联网的存在已经大幅降 ...
- PYinstall打包程序出现编码错误的解决 'utf-8' codec can't decode byte 0xce in position 171: invalid continuation b
网上说,先执行,再打包 chcp 65001 试过没有用. 解决方案: 把import的包批量注释,然后寻找是import那个文件导致. 虽然注释会导致程序运行出错,但是打包才不管你能不能运行. 最后 ...
- ChatGPT的那些事 -1- 背景资料
ChatGPT的那些事 -1- 背景资料 多处搬运,学无止境 目 录 1 关键词 1 1.1. AIGC(百度百科) 1 1.2. AlphaGo(百度百科) 1 1.3. ChatG ...
- C#重点语法——特性
特性的基本理解 ************************************************************************************* 一.含义 特 ...