Laden...

DynamicProxy - Ein Helper für Duck-Typing

Erstellt von TheBrainiac vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.733 Views
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren
DynamicProxy - Ein Helper für Duck-Typing

Beschreibung:

Manchmal hat man das Problem, dass man vorgegebene Klassenstrukturen hat, die man in ein schon vorhandenes (anderes) System einpflegen muss. Da kann es schon mal vorkommen, dass ein Interface existiert und eine Klasse auch die richtigen Methoden/Properties/Events bereitstellt, aber das Interface nicht implementiert. Hierzu dient die Klasse DynamicProxy, die ein Objekt auf ein Interface "mappen" kann, und zwar dynamisch. Es wird ein eigener Proxy-Typ geschaffen, der für jedes Objekt von gleichen Typ benutzbar ist. Einmal erstellte Proxies werden gecacht, was die Performance beschleunigt.

Dokumentation:
DynamicProxy stellt folgende (als Extension-Methods implementierte) Methoden bereit:

// Prüft, ob sich das Object "obj" auf das Interface vom Typ TInterface mappen lässt.
bool LooksLike<TInterface>(this object obj);

// Mappt das übergebene Object auf das Interface vom Typ TInterface.
TInterface MakeProxy<TInterface>(this object obj);

Beispiel:
Wir haben ein wichtiges & viel genutztes Interface:

public interface IHasName {
    string Name { get; }
}

Nun haben wir eine 3rd-Party-Bibliothek, die die folgende Klasse bereitstellt, wie wir sehen, aber ohne das Interface:

public class Person {
    public string Name { get; set; }
}

Wir brauchen aber zwingend das Interface, um die Person verarbeiten zu können:

public void Process(IHasName hasName) {
    // Tue irgendwas
}

Früher hätten wir dazu für jedes Interface pro Klasse einen eigenen Proxy per Hand schreiben müssen, diese Arbeit nimmt uns DynamicProxy ab:

var bob = new Person { Name = "Bob" };
if (bob.LooksLike<IHasName>()) {
    var bobHasName = bob.MakeProxy<IHasName>();
    
    Process(bobHasName);
}

Gruß,
Christian.

Support für generische Interfaces hinzugefügt (Namensgebung der Proxies).

Schlagwörter: duck typing ducktyping proxy generator reflection typebuilder assemblybuilder code erstellung

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`