2009-07-16 3 views
5

En Java, il est possible d'implémenter dynamiquement une interface en utilisant un proxy dynamique, quelque chose comme ceci:Quel est l'équivalent .Net des Dynamic Proxies de Java?

public static <T> T createProxy(InvocationHandler invocationHandler, Class<T> anInterface) { 
    if (!anInterface.isInterface()) { 
     throw new IllegalArgumentException("Supplied interface must be an interface!"); 
    } 
    return (T) Proxy.newProxyInstance(anInterface.getClassLoader(), new Class[]{anInterface}, invocationHandler); 
} 

Y at-il un équivalent en .Net?

Répondre

4

Il y a plusieurs bibliothèques qui mettent en œuvre ce dans .NET. Here's a list of them, avec un point de référence.

+0

Oui. Il y a un ensemble de cadre fournissant cette fonctionnalité. –

0

Il n'y a pas directe équivalent, mais voir How to do Dynamic Proxies in C# pour certaines solutions de contournement:

Contexte: Un proxy dynamique génère dynamiquement une classe à l'exécution qui est conforme à une interface particulière, mandatement toutes les invocations à une seule méthode "générique".

Plus tôt, Stellsmi a demandé si c'est possible de le faire dans .NET (c'est une partie standard de Java ). Voyant que c'est la deuxième fois que je en ai parlé en autant de jours, je pense que ça vaut blogging ...

2

Oui. Vous dérivez du résumé RealProxy class.

+0

Vous avez tort. RealProxies sont utilisés à des fins complètement différentes (.NET Remoting). De plus, vous ne pouvez pas les utiliser pour des types non-MBR. –

+3

Les RealProxies sont utilisés pour la communication à distance, mais ils ne doivent pas être utilisés uniquement à cette fin. Vous pouvez parfaitement les utiliser pour intercepter des appels dans le même processus. De plus, alors qu'ils sont limités à MarshalByRefObject pour _classes_, la question portait sur _interfaces_, et RealProxy supporte toutes les interfaces (car elles sont toujours vtable-dispatch). –

1

Jetez également un coup d'œil à PoshSharp (framework AOP pour .NET) - il peut faire des choses similaires, mais à la compilation. Probablement que vous préféreriez l'approche qu'il supporte.

4

Le plus utilisé est le Castle Project's Dynamic Proxy, qui est également utilisé par plusieurs (ou au moins 1) cadres de simulation. Gardez à l'esprit que les méthodes (et les méthodes surchargées comme les propriétés) ne sont pas virtuelles par défaut dans dotnet, ce qui peut créer des problèmes si vous ne l'anticipez pas dans votre conception de classe.

+0

Plus d'un cadre de moquerie. Voir ici http://castleproject.org/dynamicproxy/index.html pour une liste très partielle de projets utilisant Dynamic Proxy –

Questions connexes