是否有可能定义它的目标,例如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.