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 "";
    }
}