MulticastAttributeUsage を使用せずにクラス、インターフェイス、プロパティ、フィールド、またはメソッドに適用できる Postsharp 属性を使用して、ユーザーがすべてのメンバーにマルチキャストせずに適用するメンバーを正確に決定することは可能ですか?
MulticastAttributeUsage を使用し、クラスで属性を使用すると、生成された IL のすべてのプロパティ、メソッドなどに属性の新しいインスタンスが自動的に配置されます。
私がそれを使用しないと、それを使用する必要があると不平を言うため、コンパイルされません (私は Aspect クラスから派生しています)。
これが私のシナリオです:
新しいシリアライゼーション属性を作成しているので、これを実行できるようにしたい:
[Serialise(ApplyToProperty="Test2", Name="Blah2")]
public class MyClass {
[Serialise(Name="Blah1")]
public string Test1 { get; set; }
public bool Test2 { get; set; }
}
MulticastAttributeUsage を使用して実行時に反映すると、Test1 で 2 つの 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 を使用して別の側面を導入する必要があります。私の SerialiseAttribute コードは次のとおりです。
[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
}
}
また、CompileTimeValidate から false を返しているという事実は、生成された IL に影響を与えていないようです。残念ながら、「サイレント エラー」は「属性を適用しない」という意味ではないようです。では、Postsharp が実際に属性をすべてのメンバーにマルチキャストするのを防ぐにはどうすればよいでしょうか?