2009-07-28 12 views
6

Estoy utilizando el castillo DynamicProxy y me preguntaba si hay una forma de detectar si un tipo es un proxy sin hacer referencia a Castle DynamicProxy.¿Cómo detectar si un Tipo es un DynamicProxy generado sin hacer referencia a Castle DynamicProxy?

Así que mientras uso Castle DynamicProxy como ejemplo me gustaría un código que funcione para cualquier tipo de memoria generada.

var generator = new ProxyGenerator(); 


var classProxy = generator.CreateClassProxy<Hashtable>(); 
Debug.WriteLine(classProxy.GetType().Is....); 


var interfaceProxy = generator.CreateInterfaceProxyWithoutTarget<ICollection>(); 
Debug.WriteLine(interfaceProxy.GetType().Is....); 

Gracias

Respuesta

0

hasta ahora tengo este código fugly

private static bool IsDynamic(Type type) 
    { 
     try 
     { 
      var location = type.Assembly.Location; 
      return false; 
     } 
     catch (NotSupportedException) 
     { 
      return true; 
     } 
    } 
+0

Como Ayende señaló http://groups.google.com/group/castle-project-users/browse_thread/thread/d1c3b4464aad6043 Ubicación lanzar una excepción es un efecto secundario. lo mismo ocurriría si usa Assembly.Load (File.ReadAllBytes ("Nhibernate.dll")); – Simon

0

Esto parece estar funcionando para Castle:

private static bool IsDynamic(Type type) 
{ 
    return type.Namespace == null; 
} 
+0

Pero eso es específico de la implementación del castillo. Puede que no sea cierto para otros generadores proxy :( – Simon

+1

Esto no funcionará con la troncal y la v2.2 venidera porque los proxies ahora tienen un espacio de nombres –

9
type.Assembly.FullName.StartsWith("DynamicProxyGenAssembly2") 
+0

necesitan algo no específico de castle – Simon

+2

Quiere detectar si el tipo es un proxy DynamicProxy ¿Cómo eso NO es específico de Castle? –

+0

Estoy usando DynamicProxy como ejemplo para que la gente pueda saber fácilmente de lo que estoy hablando. Pero estoy buscando un código que me diga si es un tipo generado en tiempo de ejecución. – Simon

3

Se podría hacer que su tipo dinámico implementa una interfaz específica:

public interface IDynamicProxy { } 

... 

ProxyGenerator generator = new ProxyGenerator(); 

var classProxy = generator.CreateClassProxy(typeof(Hashtable), new[] {typeof(IDynamicProxy)}); 
Debug.WriteLine(classProxy is IDynamicProxy); 


var interfaceProxy = generator.CreateInterfaceProxyWithoutTarget(typeof(ICollection), new[] { typeof(IDynamicProxy) }); 
Debug.WriteLine(interfaceProxy is IDynamicProxy); 
Cuestiones relacionadas