0

プロジェクトでは、Castle Dynamic Proxy を使用して、ファサードによって実行されるすべてのコードを try/catch ブロックでラップしています (奇妙に聞こえますか?ここで説明されています)。これは問題なく動作しますが、すべてのメソッド呼び出しが確実にインターセプトされるようにするために、インターフェイスのNonProxyableMemberNotificationメソッドを使用して、仮想以外のものに遭遇したときに例外をスローします。IProxyGenerationHook

public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo)
{
    throw new InvalidOperationException(string.Format(
          "Proxy failure. {0} {1} in {2} is not virtual.", 
          memberInfo.MemberType, memberInfo.Name, memberInfo.DeclaringType));
}

Krzysztof Koźmic のすばらしいチュートリアルによると、オブジェクト クラスは特殊なケースであり、デフォルトでは DynamicProxy はそれらを無視します。私の場合、次のサンプルMemberInfoデータからわかるように、問題は無視されません。

memberInfoクイックウォッチ

ここで見逃したものはありますか?NonProxyableMemberNotificationオブジェクトメソッドで起動するはずですか?

私は .Net 3.5、VS2010、Castle Core バージョン 2.5.2 を使用していObject.GetType()ますXmlDocumentBackend

4

2 に答える 2

2

NonProxyableMemberNotification のこの実装を使用します。

public void NonProxyableMemberNotification(Type type, System.Reflection.MemberInfo memberInfo)
    {
        if (memberInfo.DeclaringType != typeof(object))
        {
            string message = string.Format("Non-proxyable member encountered - {0} (type - {1})",
                memberInfo.Name, type.FullName);
            throw new InvalidOperationException(message);
        }
    }
于 2011-10-31T09:03:35.737 に答える
2

チュートリアルは、DynamicProxy バージョン 2.1 IIRC 用に作成されました。

System.Object のメソッドを実際に傍受する必要がある状況があったため、DynamicProxy のその側面は最近のバージョンで変更されました。( GerHashCodeEqualsToString...)。そのため、DP はインターセプト可能であることを内部的にブラックリストに登録せず、代わりに(クラス)System.Objectのデフォルトの実装に依存してそれを実行します (必要に応じてオーバーライドできるようにするため)。IProxyGenerationHookAllMethodsHook

System.Objectしたがって、メソッドを事前にフィルタリングしたい場合は、このクラスから継承してbase実装を使用してください。

ただし、これがいかに混乱を招く可能性があるかは理解できるので、特殊なケースである GetHasCode が、メソッドに到達する前でも簡単に事前フィルター処理できるかどうかを確認しますNonProxyableMemberNotification

于 2011-11-06T00:11:37.583 に答える