C# 在多个成员上使用Postsharp Aspect,而不进行多重强制转换

C# 在多个成员上使用Postsharp Aspect,而不进行多重强制转换,c#,postsharp,C#,Postsharp,是否可能有一个Postsharp属性,该属性可以应用于类、接口、属性、字段或方法,而无需使用MulticastAttributeUsage,这样用户就可以准确地决定它应用于哪些成员,而无需对每个成员进行多播 如果我使用MulticastAttributeUsage并在类上使用my属性,它会自动在生成的IL中的所有属性、方法等上放置my属性的新实例 如果我不使用它,它将不会编译,因为它抱怨我需要使用它(我从Aspect类派生) 以下是我的设想: 我正在创建一个新的序列化属性,因此我希望能够执行以下

是否可能有一个Postsharp属性,该属性可以应用于类、接口、属性、字段或方法,而无需使用MulticastAttributeUsage,这样用户就可以准确地决定它应用于哪些成员,而无需对每个成员进行多播

如果我使用MulticastAttributeUsage并在类上使用my属性,它会自动在生成的IL中的所有属性、方法等上放置my属性的新实例

如果我不使用它,它将不会编译,因为它抱怨我需要使用它(我从Aspect类派生)

以下是我的设想:

我正在创建一个新的序列化属性,因此我希望能够执行以下操作:

[Serialise(ApplyToProperty="Test2", Name="Blah2")]
public class MyClass {

    [Serialise(Name="Blah1")]
    public string Test1 { get; set; }

    public bool Test2 { get; set; }
}
当我在运行时使用multicastatributeusage进行反思时,我在Test1上得到了两个Serialise属性。当我查看生成的IL时,它显示:

[Serialise(ApplyToProperty = "Test2", Name = "Blah2")]
public class Test {

    [Serialise(ApplyToProperty = "Test2", Name = "Blah2"), Serialise(Name = "Blah")]
    public string Test1 { get; set; }

    [Serialise(ApplyToProperty = "Test2", Name = "Blah2")]
    public bool Test2 { get; set; }

}
我不能使用Postsharp,运行时的反射将完全满足我的需要,但我需要使用Postsharp来介绍另一个方面。我的属性代码如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Property | AttributeTargets.Field)]
[MulticastAttributeUsage(MulticastTargets.Class | MulticastTargets.Interface | MulticastTargets.Property | MulticastTargets.Field, AllowMultiple = true, PersistMetaData = true, Inheritance = MulticastInheritance.None)]
public class SerialiseAttribute : Aspect, IAspectProvider {

    public string ApplyToProperty { get; set; }
    public string Name { get; set; }

    public override bool CompileTimeValidate(object target) {           
        return false;
    }       

    IEnumerable<AspectInstance> IAspectProvider.ProvideAspects(object targetElement) {
        // Code that introduces a different attribute
    }

}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Property | AttributeTargets.Field)]
[MulticastAttributeUsage(MulticastTargets.Class | MulticastTargets.Interface | MulticastTargets.Property | MulticastTargets.Field,AllowMultiple=true,PersistMetaData=true,Inheritation=MulticastInheritance.None)]
公共类SerialiseAttribute:方面,IAspectProvider{
公共字符串ApplyToProperty{get;set;}
公共字符串名称{get;set;}
公共重写bool CompileTimeValidate(对象目标){
返回false;
}       
IEnumerable IAspectProvider.ProvideSpects(对象targetElement){
//引入不同属性的代码
}
}

还请注意,我从CompileTimeValidate返回false这一事实似乎对生成的IL没有任何影响,不幸的是,“静默失败”似乎并不意味着“不要对其应用属性”。那么,如何防止Postsharp将该属性实际多播给所有成员呢?

您的自定义属性源自
方面
类,而该类又源自
多播属性
——这就是您获得多播行为的原因

相反,您可以从
System.Attribute
派生并实现所需的所有接口。在您的案例中,这将是
IAspectProvider
IValidableAnnotation

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Property | AttributeTargets.Field)]
public class Serialise : Attribute, IAspectProvider, IValidableAnnotation
{
    public string ApplyToProperty { get; set; }
    public string Name { get; set; }

    public bool CompileTimeValidate(object target)
    {
        return false;
    }

    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        // Code that introduces a different attribute
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Property | AttributeTargets.Field)]
公共类序列化:属性、IAspectProvider、IValidableAnnotation
{
公共字符串ApplyToProperty{get;set;}
公共字符串名称{get;set;}
公共bool CompileTimeValidate(对象目标)
{
返回false;
}
公共IEnumerable ProvideSpects(对象targetElement)
{
//引入不同属性的代码
}
}
至于
CompileTimeValidate
方法-此方法将仅在执行多播后运行,以确定是否为已应用属性的每个给定代码元素引入方面