自定义Attribute需继承System.Attribute并可用AttributeUsage限定作用目标,通过反射在运行时读取,实现如权限控制、日志记录等横切关注点的声明式编程。

在C#中,自定义Attribute(特性)是一种强大的元数据编程手段,允许开发者将声明性信息附加到代码元素上,如类、方法、属性等。这些信息可以在运行时通过反射读取并执行相应逻辑,广泛应用于序列化、权限验证、日志记录、AOP(面向切面编程)等场景。
要创建一个自定义特性,需要定义一个继承自System.Attribute的类。命名惯例是将类名以“Attribute”结尾,但在使用时可以省略该后缀。
示例:定义一个用于标记需要权限验证的方法特性
public class RequirePermissionAttribute : Attribute
{
public string Permission { get; }
public RequirePermissionAttribute(string permission)
{
Permission = permission;
}
}
这个特性只能用于方法,但默认情况下它可以应用于任何程序元素。为了限制使用范围,可以使用AttributeUsage特性进行约束。
通过AttributeUsage指定特性可应用的目标元素类型、是否允许多次使用以及是否继承到派生类。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequirePermissionAttribute : Attribute
{
public string Permission { get; }
public RequirePermissionAttribute(string permission)
{
Permission = permission;
}
}
定义完特性后,可在运行时通过反射检查某个成员是否被标记,并获取其数据,从而决定程序行为。
示例:检查方法是否需要特定权限
public static bool HasPermissionRequirement(MethodInfo method, string requiredPermission)
{
var attr = method.GetCustomAttribute<RequirePermissionAttribute>();
return attr != null && attr.Permission == requiredPermission;
}
使用方式:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
466
public class OrderService
{
[RequirePermission("ManageOrders")]
public void DeleteOrder(int orderId)
{
// 删除订单逻辑
}
}
// 调用时检查权限
var method = typeof(OrderService).GetMethod("DeleteOrder");
if (HasPermissionRequirement(method, "ManageOrders"))
{
Console.WriteLine("该方法需要 ManageOrders 权限");
}
虽然C#本身不直接支持方法拦截,但结合特性与动态代理(如Castle DynamicProxy)或源生成器(Source Generator),可以实现类似AOP的功能。
例如,在ASP.NET Core中,AuthorizeAttribute就是典型的自定义特性应用——控制器或动作方法被打上该特性后,请求会先经过授权中间件验证。
你也可以设计一个日志特性:
public class LogExecutionTimeAttribute : Attribute { }
配合依赖注入和拦截机制,在方法执行前后自动记录耗时(需借助第三方库或编译期工具)。
基本上就这些。自定义Attribute + 反射构成了C#元数据驱动编程的核心,合理使用能让代码更清晰、扩展性更强。关键在于把横切关注点(如权限、日志、验证)从主业务逻辑中解耦出来,提升可维护性。
以上就是C#如何实现自定义Attribute(特性)?元数据编程在C#中的高级应用的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号