C#中如何检索类属性值及自定义特性类的公共成员?
问题解答
1. 在C#中能否从自定义特性类中检索公共成员?
当然可以!这其实就是自定义特性设计的核心用途之一——让我们能在运行时获取类/方法/字段等元素上附加的元数据,包括特性类里的公共属性、字段甚至方法。你定义的ModuleMessageHandlerAttribute里的type公共属性,完全可以被正常检索和访问。
2. 如何检索类特性的属性值?
结合你给出的代码示例,我直接给你具体的实现步骤和可运行代码:
实现步骤:
- 先获取目标类(比如
HelloMessageHandler)的Type对象 - 通过反射方法获取该类上的
ModuleMessageHandlerAttribute实例 - 检查特性实例是否存在,然后访问它的
type属性 - 对比这个属性值和你要判断的特定类(比如
HelloModule)
完整代码示例:
using System; using System.Reflection; // 你的特性类(保持不变) [AttributeUsage(AttributeTargets.Class, Inherited = false)] public class ModuleMessageHandlerAttribute : Attribute { public Type type { get; set; } public ModuleMessageHandlerAttribute(Type type) { this.type = type; } } // 你的处理程序类(保持不变) [ModuleMessageHandler(typeof(HelloModule))] public class HelloMessageHandler : IMessageHandler<Hello> { } // 假设的依赖接口和类(模拟你的业务场景) public interface IMessageHandler<T> { } public class Hello { } public class HelloModule { } // 检索特性并判断匹配的逻辑 class Program { static void Main(string[] args) { // 1. 获取目标类的Type对象 Type handlerType = typeof(HelloMessageHandler); // 2. 检索自定义特性(泛型版本更简洁易读) ModuleMessageHandlerAttribute attribute = handlerType.GetCustomAttribute<ModuleMessageHandlerAttribute>(); if (attribute != null) { // 3. 访问特性的公共成员type Type targetType = attribute.type; // 4. 判断是否与特定类匹配 bool isMatched = targetType == typeof(HelloModule); Console.WriteLine(isMatched ? "特性的Type属性与HelloModule匹配!" : "特性的Type属性与HelloModule不匹配!"); } else { Console.WriteLine("HelloMessageHandler类上没有应用ModuleMessageHandlerAttribute特性"); } } }
补充细节:
- 记得引用
System.Reflection命名空间,GetCustomAttribute是该命名空间下的扩展方法 - 如果你的特性允许在同一个类上应用多次(需要修改
AttributeUsage的AllowMultiple = true),可以用GetCustomAttributes<ModuleMessageHandlerAttribute>()方法获取所有特性实例,再遍历处理 - 由于你的特性设置了
Inherited = false,子类不会继承这个特性,检索时无需考虑继承的情况
内容的提问来源于stack exchange,提问作者Hamza Wasi
相关产品推荐
相关产品推荐

