8

Castle DynamicProxy を使用してインターセプターを型に追加しています。ここで、基になる基本型を取得する必要があります (プロキシ自体ではありません)。

次のように ProxyUtil クラスを使用することを提案する SO に関するいくつかのヒントを見つけました。

object realInstance = ProxyUtil.GetUnproxiedInstance(proxyInstance);

これは次のようには機能しないようです

bool isProxy = ProxyUtil.IsProxy(realInstance);

は常に真です。

また、本質的に ProxyUtil が行っている次のコード スニペットを使用してみました。

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

同じ結果で、realInstance は依然としてプロキシです。

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

4

4 に答える 4

2

私は単にこのようなインターフェースを使用します

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`

それを行うためのより良いオプションがあるかもしれませんが、それは機能し、私のコードを城の参照からきれいに保ちます. お役に立てれば。

于 2012-06-22T21:20:53.620 に答える
1

generator.CreateClassProxy<MyClass>()継承ベースのプロキシ ( )を構築している場合、プロキシターゲットです。

于 2012-06-22T23:24:00.780 に答える