是否需定义两个特性类?特性目标与可选成员适用范围问题
问题解答
直接说结论:你没法实现「让LearnAttribute仅用于类,同时让它的FailMessage成员单独用于属性」的需求,必须定义两个独立的特性类,原因如下:
- 特性里的字段/属性(比如
FailMessage)本身不是特性类型,不能直接用[FailMessage]这种语法标记到其他元素上——你示例里的写法在C#里根本不合法,编译器会报错,因为FailMessage不是继承自Attribute的类。 AttributeUsage只能控制整个特性类的可应用目标,没法给特性的成员单独设置适用范围。
正确的实现方式
拆分出两个独立的特性类,分别指定它们的适用目标:
1. 仅用于类的LearnAttribute
[AttributeUsage(AttributeTargets.Class)] public sealed class LearnAttribute : Attribute { // 这里可以定义类级别的配置项 }
2. 仅用于属性的FailMessageAttribute
[AttributeUsage(AttributeTargets.Property)] public sealed class FailMessageAttribute : Attribute { // 定义提示消息相关的内容,比如: public string Message { get; set; } // 也可以用带参数的构造函数简化使用 public FailMessageAttribute(string message) { Message = message; } }
最终使用示例
[Learn] public class Foo { [FailMessage("建筑名称不能为空")] public string BuildingName { get; set; } public void Method1() { Console.WriteLine(nameof(Method1)); } }
这样就能严格限制:LearnAttribute只能标记在类上,FailMessageAttribute只能标记在属性上,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Bohn
相关产品推荐
相关产品推荐

