2012-06-18 11 views
6

Castle DynamicProxyを使用して自分のタイプにインターセプタを追加しています。 これで、基底型を取得する必要があります(プロキシ自体ではありません)。Castle DynamicProxy:プロキシされていないオブジェクトを取得する

私はこのようなProxyUtilクラスを使用することを示唆したようにいくつかのヒントが見つかりました:

object realInstance = ProxyUtil.GetUnproxiedInstance(proxyInstance); 

これは

bool isProxy = ProxyUtil.IsProxy(realInstance); 

は常に真であるとして動作するようには思えないが。

私もProxyUtilが何をしているか、本質的に次のコードスニペット、使用してみました:同じ結果と

var accessor = proxyInstance as IProxyTargetAccessor; 
var realInstance = accessor.DynProxyGetTarget(); 

を、realInstanceはまだプロキシです。

私はここで何が欠けていますか?

答えて

1

は、私は単にそれを私のプロキシに追加し、傍受この

public interface IMarker 
{ 
    Type ActualType { get; } 
} 

ようなインターフェイスを使用します。

public class MyInterceptor<T> : IInterceptor 

...

if (invocation.Method.DeclaringType == typeof(IMarker)) 
{ 
    if (invocation.Method.Name.Equals("get_ActualType")) 
    { 
    invocation.ReturnValue = typeof(T); 
    return; 
    } 
} 

をだから、最後に、私だけ確認する必要があります

if(obj is IMarker) 
    Type t = (obj as IMarker).ActualType` 

おそらくそれを行うためのより良いオプションがありますが、動作し、私のコードを城の参照からきれいに保ちます。 これが役立つことを願っています。

1

継承ベースのプロキシ(generator.CreateClassProxy<MyClass>())を構築する場合は、プロキシです。

+2

私は 'CreateClassProxyWithTarget (インスタンス、インターセプタ)'を使ってプロキシを作成しています。 NHibernateが失敗するのは、ターゲットではなくプロキシをマップする必要があると考えられるためです。 – cguedel

8

この質問は少し古いですが、うまくいけば私の解決策(.NET 4+に依存しています)は誰かを助けるでしょう。

次のようにプロキシを作成した:

ProxyGenerator generator = new ProxyGenerator(); 
MyClass proxy = generator.CreateClassProxyWithTarget(underlying, new MyInterceptor(this)); 

を、私は以下の方法で根本的なターゲットを得ることができた:

internal static TType UnwrapProxy<TType>(TType proxy) 
{ 
    if (!ProxyUtil.IsProxy(proxy)) 
     return proxy; 

    try 
    { 
     dynamic dynamicProxy = proxy; 
     return dynamicProxy.__target; 
    } 
    catch (RuntimeBinderException) 
    { 
     return proxy; 
    } 
} 

それは城の内部実装に依存している - つまり、その生成されたプロキシには__ targetメンバがあります。それは素晴らしいと自己完結型ですが、単体テストまたは2つのバックアップでバックアップされ、私たちは城のそれ以降のバージョンでこれを壊す必要があります変更をキャッチする必要があります。これはCastleのv3.2.0.0を使用しています。

+0

これは私のために働いた:)、感謝 – dbones

+0

ここで勝つために '動的'。それを反映させようとする。それは壮大な失敗でした。 – IAbstract

関連する問題