在 C# 开发中,特性(Attribute) 是一种强大的元数据机制,它允许开发者将额外信息附加到代码元素(如类、方法、属性等)上。而自定义特性的检索逻辑则是通过 C#反射编程 实现的——这是高级 C# 开发者必须掌握的核心技能之一。
本教程将手把手教你如何创建自定义特性,并通过反射实现灵活的检索逻辑。无论你是刚接触 C# 的小白,还是希望巩固反射知识的中级开发者,都能轻松理解并实践。
C#特性 是继承自 System.Attribute 的类,用于为程序元素添加声明式信息。例如,[Obsolete]、[Serializable] 都是内置特性。
假设我们要标记某些方法为“需要权限验证”,可以这样定义一个自定义特性:
using System;[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]public class RequirePermissionAttribute : Attribute{ public string PermissionName { get; } public RequirePermissionAttribute(string permissionName) { PermissionName = permissionName; }} 这里使用了 [AttributeUsage] 来限制该特性只能用于方法,并且不能重复应用。
接下来,我们在一个服务类中使用这个特性:
public class UserService{ [RequirePermission("ViewUser")] public void GetUser(int id) { Console.WriteLine($"获取用户 {id} 的信息"); } [RequirePermission("EditUser")] public void UpdateUser(int id, string name) { Console.WriteLine($"更新用户 {id} 的姓名为 {name}"); } // 没有特性的普通方法 public void LogActivity(string message) { Console.WriteLine(message); }} 现在,我们编写一个通用方法,利用 C#反射编程 来检查某个方法是否带有 RequirePermission 特性,并获取其权限名称:
using System;using System.Reflection;public static class PermissionChecker{ public static bool TryGetRequiredPermission(MethodInfo method, out string permissionName) { var attribute = method.GetCustomAttribute<RequirePermissionAttribute>(); if (attribute != null) { permissionName = attribute.PermissionName; return true; } permissionName = null; return false; }} 这段代码展示了如何使用 MethodInfo.GetCustomAttribute<T>() 方法安全地获取自定义特性。如果存在,就返回权限名;否则返回 false。
下面是一个完整的控制台程序,演示如何遍历所有方法并执行 自定义特性的检索:
class Program{ static void Main() { var userServiceType = typeof(UserService); var methods = userServiceType.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (var method in methods) { if (PermissionChecker.TryGetRequiredPermission(method, out string perm)) { Console.WriteLine($"方法 '{method.Name}' 需要权限: {perm}"); } else { Console.WriteLine($"方法 '{method.Name}' 无需特殊权限"); } } }} 输出结果:
方法 'GetUser' 需要权限: ViewUser方法 'UpdateUser' 需要权限: EditUser方法 'LogActivity' 无需特殊权限 在实际项目中,频繁使用反射会影响性能。建议对检索结果进行缓存。例如,使用 ConcurrentDictionary 缓存方法与其权限映射:
private static readonly ConcurrentDictionary<MethodInfo, string> _permissionCache = new ConcurrentDictionary<MethodInfo, string>();public static string GetPermissionCached(MethodInfo method){ return _permissionCache.GetOrAdd(method, m => { var attr = m.GetCustomAttribute<RequirePermissionAttribute>(); return attr?.PermissionName ?? string.Empty; });} 通过本教程,你已经掌握了如何在 C# 中创建和应用自定义特性,并通过 反射获取特性 实现灵活的检索逻辑。这种技术广泛应用于权限控制、日志记录、API 文档生成等场景。
记住,C#特性 本身不执行任何逻辑,它们只是“标签”。真正的行为由你的检索代码(通常基于反射)来驱动。合理使用 自定义特性检索 和 C#反射编程,能让你的代码更简洁、更可维护。
提示:在生产环境中,请注意反射的性能开销,并考虑使用缓存或源生成器(Source Generators)进行优化。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126004.html