2009-07-28 14 views
6

J'utilise Castle DynamicProxy et je me demandais s'il y avait un moyen de détecter si un Type est un proxy sans faire référence à Castle DynamicProxy?Comment détecter si un Type est un DynamicProxy généré sans faire référence à Castle DynamicProxy?

Donc, alors que j'utilise Castle DynamicProxy comme exemple, j'aimerais que le code fonctionne pour tout type de mémoire généré.

var generator = new ProxyGenerator(); 


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


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

Merci

Répondre

0

i ont jusqu'à présent ce code fugly

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

Comme Ayende a souligné http://groups.google.com/group/castle-project-users/browse_thread/thread/d1c3b4464aad6043 Lieu lancer une exception est un effet secondaire. la même chose se produirait si vous utilisez Assembly.Load (File.ReadAllBytes ("Nhibernate.dll")); – Simon

0

Cela semble fonctionner pour le château:

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

Mais c'est spécifique à l'implémentation du château. Peut ne pas être vrai pour les autres générateurs proxy :( – Simon

+1

Cela ne fonctionnera pas avec le tronc et la v2.2 à venir parce que les proxies ont maintenant un espace de noms –

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

besoin de quelque chose de non spécifique au château – Simon

+2

Vous voulez détecter si le type est un proxy DynamicProxy –

+0

J'utilise DynamicProxy comme exemple pour que les gens puissent facilement savoir de quoi je parle, mais je cherche un code qui me dira s'il s'agit d'un type généré en cours d'exécution – Simon

3

Vous pouvez rendre votre type dynamique implémente une interface spécifique:

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);