2015-10-06 59 views
1

我創建了一個繼承LocationInterceptionAspect的屬性。 出於演示的目的,代碼如下:PostSharp LocationInterceptionAspect不適用於繼承的屬性

[Serializable] 
public class RepeaterAttribute : LocationInterceptionAspect 
{ 
    public override bool CompileTimeValidate(PostSharp.Reflection.LocationInfo locationInfo) 
    { 
     var propertyInfo = locationInfo.PropertyInfo; 
     if (propertyInfo == null) return false; 
     if (propertyInfo.PropertyType != typeof(String)) 
      return false; 
     return base.CompileTimeValidate(locationInfo); 
    } 
    public override void OnSetValue(LocationInterceptionArgs args) 
    { 
     args.Value = ((String)args.Value) + ((String)args.Value); 
     args.ProceedSetValue(); 
    } 
} 

我有一個名爲外部庫,並在其中一個叫父類。

namespace External 
{ 
    public class Parent 
    { 
     public String ParentProperty { get; set; } 
    } 
} 

在控制檯應用程序中,我有一個名爲Child的類從Parent繼承。 控制檯應用程序引用外部庫。

public class Child : External.Parent 
{ 
    public String ChildProperty { get; set; } 
} 

在我的控制檯應用程序中,我的代碼是。

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var child = new Child(); 
      child.ParentProperty = "A"; 
      Console.WriteLine("This should be 'AA' : '{0}'", child.ParentProperty); 
      child.ChildProperty = "B"; 
      Console.WriteLine("This should be 'BB' : '{0}'", child.ChildProperty); 
      Console.ReadKey(); 
     } 
    } 
} 

,並在控制檯應用程序的AssemblyInfo.cs我:

[assembly: ConsoleApplication.Repeater(AttributeTargetTypes = "ConsoleApplication.Child")] 

但是當我運行的中繼器的屬性沒有被應用到從父類繼承的「ParentProperty」。

回答

0

PostSharp無法更改正在轉換的組件中的類。基本屬性在不同的程序集中聲明。這是LocationInterceptionAspect的限制。

您可以使用MethodInterception,它支持不同的組件攔截方法:

[Serializable] 
public class SetterRepeaterAttribute : MethodInterceptionAspect 
{ 
    public override void OnInvoke(MethodInterceptionArgs args) 
    { 
     args.Arguments[0] = ((String)args.Arguments[0]) + ((String)args.Arguments[0]); 
     args.Proceed(); 
    } 
} 

和組播它裝配水平基類的setter方法:

[assembly: ConsoleApplication2.SetterRepeater(
    AttributeTargetMembers = "set_ParentProperty", 
    AttributeTargetTypes = "External.Parent", 
    AttributeTargetAssemblies = "regex:.*")] 

注意,在這種情況下,攔截是在調用站點級別完成的,ParentProperty設置器不會自行更改。來自原始程序集的調用不會被攔截。