3

既存のライブラリのラッパーとして動的プロキシを作成しようとしています。目標は、動的ディスパッチを介して既存のオブジェクトですべての操作(プロパティアクセス、メンバーアクセス、メソッド呼び出しなど)を処理することです。このオブジェクトのエラー処理、ロギング、アクセス制御の改善など、横断的関心事のためにそれが必要になる場合があります。

dynamicインターフェイスを実装する既存のオブジェクトのラッパー を作成することを思いつきましたが、独自のオブジェクトを実装IDynamicMetaObjectProviderしてすべてを解析するのは面倒なようです。ExpressionsDynamicMetaObject

もう1つの解決策は、クラスから継承して手間のかかるDynamicObject作業を行うことですが、ここでも仮想メソッドが多数あり、オーバーライドする方法が正確にはわかりません。私は、メソッドが何をするのか、またはそれらを実装する方法を知っているだけだと思いTrySetMemberますTryGetMemberTryInvokeMember 、使用方法がわからないメソッドは他にもたくさんあります!

public class DynamicProxy : DynamicObject
{
    private object Value;

    public DynamicProxy(object value)
    {
        this.Value = value;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;      // get proxy object value using reflection
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        // set proxy object value using reflection
        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        result = null;      // call proxy object method using reflection
        return true;
    }

    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
        return base.TryInvoke(binder, args, out result);
    }

    public override bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes)
    {
        // What to do here?
    }

    public override bool TryDeleteMember(DeleteMemberBinder binder)
    {
        // What to do here?
    }

    public override bool TryUnaryOperation(UnaryOperationBinder binder, out object result)
    {
        // What to do here?
    }

    // ... Other virtual methods of DynamicObject
}

だから私の質問は:インターフェースを完全にカバーするDynamicObjectか、少なくとも完全に実装するオープンソースライブラリはありIDynamicMetaObjectProviderますか?DynamicObject誰かが仮想メソッドの概要を指摘できますか?

4

2 に答える 2

4

のすべてのメソッドをオーバーライドする必要はありません。ほとんどの場合、これで十分ですDynamicObject。すべてのメソッドにデフォルトの実装があり、変更するメソッドのみを実装できますTryGetMemberTrySetMemberDynamicObject

DynamicObjectはを実装するクラスなIDynamicMetaObjectProviderので、ラッパーに他の基本クラスが必要ない場合はこれを使用してください

実装IDynamicMetaObjectProviderは少し退屈ですが、それを行うことにした場合はDynamicObjectILSpyでどのように実装されているかを見てください。

于 2012-11-28T09:48:13.260 に答える
1

オープンソースフレームワークImpromptuInterface(nuget内)があります。これには、基本実装であるDynamicObjectサブクラスである抽象クラスImpromptuForwarderがあり、プロパティ、メソッド、イベント、およびインデクサーのdlrを使用して呼び出しをターゲットに転送します。

また、動的実装への静的インターフェイスの入力curringメソッドレイトバウンドタイプの静的メソッドプロキシなど、他にも多くの楽しいdlrプロキシ機能があります。

于 2012-11-29T18:25:34.727 に答える