2012-06-18 15 views
6

Sto usando Castle DynamicProxy per aggiungere un interceptor ai miei tipi. Ora ho bisogno di ottenere il tipo di base sottostante (NON il proxy stesso).Castle DynamicProxy: Ottieni oggetto senza proxy

ho trovato alcuni suggerimenti, in modo che suggerisce di utilizzare la classe ProxyUtil come questo:

object realInstance = ProxyUtil.GetUnproxiedInstance(proxyInstance); 

Ciò non sembra funzionare come

bool isProxy = ProxyUtil.IsProxy(realInstance); 

è sempre vero.

Ho anche provato utilizzando il seguente frammento di codice, che è essenzialmente quello ProxyUtil sta facendo:

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

con gli stessi risultati, realInstance è ancora un proxy.

Cosa mi manca qui?

risposta

1

ho semplicemente utilizzare un'interfaccia come questo

public interface IMarker 
{ 
    Type ActualType { get; } 
} 

aggiungerlo alla mia proxy e intercettarlo:

public class MyInterceptor<T> : IInterceptor 

...

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

Così alla fine ho solo controllare

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

Forse ci sono opzioni migliori per farlo, ma funziona e mantiene il mio codice pulito dai riferimenti del castello. Spero che questo aiuti.

1

Se si sta creando un proxy basato sull'eredità (generator.CreateClassProxy<MyClass>()) il proxy è il destinazione.

+2

Sto usando 'CreateClassProxyWithTarget (istanza, interceptor)' per creare il proxy. Il problema è che NHibernate non funziona perché pensa che debba mappare il proxy e non il target. – cguedel

8

Questa domanda è un po 'vecchia, ma si spera che la mia soluzione (che si basa su .NET 4+) possa aiutare qualcuno.

aver creato un proxy come segue:

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

sono stato in grado di ottenere l'obiettivo sottostante con il seguente metodo:

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

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

Essa si basa sulla realizzazione interna di Castello - vale a dire che il proxy generato ha un membro __target. Sebbene sia carino e autonomo, e supportato da un test di unità o due, dovremmo rilevare eventuali cambiamenti nel caso in cui una versione successiva di Castle rompa questo. Questo sta usando v3.2.0.0 di Castle.

+0

questo ha funzionato per me :), grazie – dbones

+0

'dinamico' per la vittoria qui. Beats cerca di riflettere su di esso. Questo è stato un fallimento epico. – IAbstract

Problemi correlati