假设我有一个这样的attribute:

[AttributeUsage(AttributeTargets.All)]
public sealed class LearnAttribute: Attribute
{
    public string FailMessage;
}

是否有可能以一种方式定义它的目标,例如FailMessageONLY适用于property levelclass,我将装饰它和LearnAttribute本身仅适用于class的水平? 还是需要定义两个属性类?

例如,我可以有这样的东西:

[Learn]
public class Foo
{
    [FailMessage]
    public string BuildingName { get; set; }

    public void Method1()
    {
        Console.WriteLine(nameof(Method1));
    }


}

推荐答案

是否有可能定义它的目标,例如FailMessage只适用于属性级别的类,我将装饰它,LearnAttribute本身只适用于类级别?

不可以.您可以只为属性类本身定义target,所以当使用它时,它的所有对应属性/字段都是可以访问的.如果你真的想,你可以写一个Roslyn analyzer来做需要的事情,但我认为这将是一个相当混乱的API,所以我建议坚持使用更惯用的方法与两个不同的属性.

如果需要,可以创建属性层次 struct :

[AttributeUsage(AttributeTargets.All)]
public class LearnAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Property)]
public sealed class LearnWithFailMessageAttribute : LearnAttribute
{
    public string FailMessage;
}

[Learn]
// [LearnWithFailMessage] // will not compile
public class Foo1
{
    [LearnWithFailMessage(FailMessage = "")]
    public string BuildingName { get; set; }

    public void Method1()
    {
        Console.WriteLine(nameof(Method1));
    }
}

LearnWithFailMessage也可以通过基类类型访问:

var propertyInfo = typeof(Foo1).GetProperty(nameof(Foo1.BuildingName));
var customAttribute = propertyInfo.GetCustomAttribute<LearnAttribute>();
Console.WriteLine(customAttribute.GetType().Name); // prints "LearnWithFailMessageAttribute"

但是请注意,使用属性层次 struct 可能会有一些怪癖—参见示例this github issue.

Csharp相关问答推荐

程序集.加载从exe的异常

如何使用ConcurentDictionary属性上的属性将自定义System.Text.Json JsonConverter应用于该属性的值?

在具有主构造函数的类中初始化属性时出现警告

S能够用DATETIME来计算,这有什么错呢?

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

单行上的ReSharper数据标注

C#带主体的主构造函数?

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

VS 2022与VS 2019:如何/为什么创建额外的任务?

为什么此名称不再被识别?名称不存在于当前上下文中?

MudBlazor Textfield已禁用,但其验证工作正常

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

错误:此版本的Visual Studio无法打开以下项目

如何设置WinForms按钮焦点,使其看起来像是被Tab键插入其中?

如何使用LINQ在C#中填充列表列表?

Xamarin.Forms项目中缺少MainPage.xaml

获取应用程序版本信息时出现奇怪信息

游戏对象走向不同的方向

从具有泛型类型约束的类继承-Blazor