PostSharp LocationInterceptionAspect 未应用于继承的属性
PostSharp LocationInterceptionAspect not being applied to inherited properties
我创建了一个继承 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();
}
}
我有一个名为 External 的库,其中有一个 class 称为 Parent。
namespace External
{
public class Parent
{
public String ParentProperty { get; set; }
}
}
在控制台应用程序中,我有一个名为 Child 的 class 继承自 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")]
但是当我 运行 时,Repeater 属性未应用于从父 class 继承的 "ParentProperty"。
PostSharp 无法更改 classes 在它正在转换的不同程序集中。基 属性 在不同的程序集中声明。这是 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();
}
}
并在汇编级别将其多播到基 class:
的 setter
[assembly: ConsoleApplication2.SetterRepeater(
AttributeTargetMembers = "set_ParentProperty",
AttributeTargetTypes = "External.Parent",
AttributeTargetAssemblies = "regex:.*")]
请注意,在这种情况下,拦截是在调用站点级别完成的,ParentProperty setter 本身没有更改。来自原始程序集的调用不会被拦截。
我创建了一个继承 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();
}
}
我有一个名为 External 的库,其中有一个 class 称为 Parent。
namespace External
{
public class Parent
{
public String ParentProperty { get; set; }
}
}
在控制台应用程序中,我有一个名为 Child 的 class 继承自 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")]
但是当我 运行 时,Repeater 属性未应用于从父 class 继承的 "ParentProperty"。
PostSharp 无法更改 classes 在它正在转换的不同程序集中。基 属性 在不同的程序集中声明。这是 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();
}
}
并在汇编级别将其多播到基 class:
的 setter[assembly: ConsoleApplication2.SetterRepeater(
AttributeTargetMembers = "set_ParentProperty",
AttributeTargetTypes = "External.Parent",
AttributeTargetAssemblies = "regex:.*")]
请注意,在这种情况下,拦截是在调用站点级别完成的,ParentProperty setter 本身没有更改。来自原始程序集的调用不会被拦截。