2016-02-05 59 views
0

看點看起來像這樣Postsharp - 介紹虛擬方法被調用,而不是覆蓋方法

[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引入是虛擬的。 Aspect應用於與不同項目中的子類相同的基類。問題是當我重寫此方法並調用OnInvoke攔截器時,SomeMethod方面實際上是用NotImplementedException而不是overriden方法調用的。調試器確認我在args.Instance中擁有正確的實例。這怎麼可能?謝謝你的回答。

+0

你的代碼在哪裏試圖覆蓋該方法看起來像什麼? – Batavia

+0

更多代碼http://support.sharpcrafters.com/discussions/problems/3039-introduced-virtual-method-called-instead-overriden – sanjuro

回答

1

這是一個在PostSharp將來要解決的問題自PostSharp 4.2.22/4.3.5開始解決。

原來答案的其餘部分:

但有一種變通方法。

讓我看到問題中描述的代碼。在項目中的基礎類是這樣的:

[MyAspect] 
public abstract class BaseClass 
{ 
    public void InterceptedMethod(string message) 
    { 
    } 
} 

子類B工程重現這個Bug是這樣的:

public class ChildClass : BaseClass 
{ 
    public override string SomeMethod() 
    { 
     return ""; 
    } 
} 

現在的解決方法是實現接口的方法,而不是重寫它。

public class ChildClass : BaseClass, ISomeMethod 
{ 
    public string SomeMethod() 
    { 
     return ""; 
    } 
} 
+0

謝謝,我被固定到我的課程的設計和這個錯誤這麼多,我沒有'噸通知這種簡單的解決方法,這將是足夠的,我正在努力完成:) – sanjuro