2013-10-04 1 views
2

MulticastAttributeUsage를 사용하지 않고 클래스, 인터페이스, 속성, 필드 또는 메서드에 적용 할 수있는 포스트 샤프 속성을 사용할 수 있습니까? 그것은 모든 회원에게 멀티 캐스팅없이 적용된다.다중 캐스트를 사용하지 않고 여러 멤버의 포스트 샤프 측면 사용

MulticastAttributeUsage를 사용하고 클래스에 내 속성을 사용하면 생성 된 IL의 모든 속성, 메서드 등에 내 속성의 새 인스턴스가 자동으로 추가됩니다.

필자가 사용하지 않으면, 필자는 그것을 사용해야한다고 (필자는 Aspect 클래스에서 파생 됨) 불평하기 때문에 컴파일되지 않을 것이다. 여기

내 시나리오입니다 :

나는 새로운 직렬화 속성을 만드는 오전, 그래서 나는이 작업을 수행 할 수 있도록하려면 : 내가지고있어 MulticastAttributeUsage를 사용하여 런타임에 반영

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

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

    public bool Test2 { get; set; } 
} 

Test1에서 두 개의 Serialise 특성. 런타임에

[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를 사용해야합니다 : 나는 IL 볼 때이 표시 생성. 내 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가 실제로 모든 구성원에게 속성을 멀티 캐스팅하지 못하게하려면 어떻게해야합니까?

답변

2

사용자 지정 특성은 에서 파생 된 Aspect 클래스에서 파생됩니다. 이것이 멀티 캐스팅 동작을 얻는 이유입니다.

대신 할 수있는 일은 System.Attribute에서 파생되며 필요한 모든 인터페이스를 구현하는 것입니다. 귀하의 경우에는 IAspectProviderIValidableAnnotation입니다.

[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 
    } 
} 

CompileTimeValidate 방법에 관해서 - 멀티 캐스팅이 이미 도포 특성을 가진 각각의 주어진 코드 요소 측면을 도입 여부를 결정하도록 수행 된 후에이 방법은 실행된다.