You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需定义两个特性类?特性目标与可选成员适用范围问题

问题解答

直接说结论:你没法实现「让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:32:42