Postsharp - 调用引入的虚方法而不是覆盖方法
Postsharp - Introduced virtual method is called instead overriden method
看点是这样的
[Serializable]
[IntroduceInterface(typeof(ISomeMethod), OverrideAction = InterfaceOverrideAction.Ignore)]
public class MyAspect: InstanceLevelAspect, ISomeMethod
{
[IntroduceMember(IsVirtual = true, OverrideAction = MemberOverrideAction.Ignore)]
public string SomeMethod()
{
throw new NotImplementedException();
}
[OnMethodInvokeAdvice, MulticastPointcut(Targets = MulticastTargets.Method, Attributes = MulticastAttributes.Public)]
public void OnInvoke(MethodInterceptionArgs args)
{
var something = args.Instance as ISomeMethod;
//here is problem
string str = something.SomeMethod();
args.Proceed();
}
}
当我在 dotPeek 中检查它时,引入了 SomeMethod 并且是虚拟的。方面应用于作为子 classes 在不同项目中的基础 class。问题是当我覆盖此方法并调用 OnInvoke 拦截器时,方面的 SomeMethod 实际上是使用 NotImplementedException 而不是覆盖方法调用的。调试器确认我在 args.Instance 中有正确的实例。这怎么可能?谢谢回答。
这是一个错误,将在 PostSharp 的未来版本中解决 自 PostSharp 4.2.22/4.3.5 以来已解决。
其余原答案:
但有一个解决方法。
让我想象一下问题中描述的代码。项目 A 中的基础 class 如下所示:
[MyAspect]
public abstract class BaseClass
{
public void InterceptedMethod(string message)
{
}
}
项目 B 中的 child class 重现错误如下所示:
public class ChildClass : BaseClass
{
public override string SomeMethod()
{
return "";
}
}
目前的解决方法是实现接口方法而不是覆盖它。
public class ChildClass : BaseClass, ISomeMethod
{
public string SomeMethod()
{
return "";
}
}
看点是这样的
[Serializable]
[IntroduceInterface(typeof(ISomeMethod), OverrideAction = InterfaceOverrideAction.Ignore)]
public class MyAspect: InstanceLevelAspect, ISomeMethod
{
[IntroduceMember(IsVirtual = true, OverrideAction = MemberOverrideAction.Ignore)]
public string SomeMethod()
{
throw new NotImplementedException();
}
[OnMethodInvokeAdvice, MulticastPointcut(Targets = MulticastTargets.Method, Attributes = MulticastAttributes.Public)]
public void OnInvoke(MethodInterceptionArgs args)
{
var something = args.Instance as ISomeMethod;
//here is problem
string str = something.SomeMethod();
args.Proceed();
}
}
当我在 dotPeek 中检查它时,引入了 SomeMethod 并且是虚拟的。方面应用于作为子 classes 在不同项目中的基础 class。问题是当我覆盖此方法并调用 OnInvoke 拦截器时,方面的 SomeMethod 实际上是使用 NotImplementedException 而不是覆盖方法调用的。调试器确认我在 args.Instance 中有正确的实例。这怎么可能?谢谢回答。
这是一个错误,将在 PostSharp 的未来版本中解决 自 PostSharp 4.2.22/4.3.5 以来已解决。
其余原答案:
但有一个解决方法。
让我想象一下问题中描述的代码。项目 A 中的基础 class 如下所示:
[MyAspect]
public abstract class BaseClass
{
public void InterceptedMethod(string message)
{
}
}
项目 B 中的 child class 重现错误如下所示:
public class ChildClass : BaseClass
{
public override string SomeMethod()
{
return "";
}
}
目前的解决方法是实现接口方法而不是覆盖它。
public class ChildClass : BaseClass, ISomeMethod
{
public string SomeMethod()
{
return "";
}
}