RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Verteilte Systeme und Services mit .NET 4.0: Konzepte und Lösungen mit WCF 4.0,
Hanser Fachbuchverlag

Weitere Infos

 

.NET 4 Update,
Microsoft Press

Weitere Infos

 
Weitere Bücher
Meine Artikel

Leichtgewichtige Kommunikation: REST-basierte Services mit dem neuen API aus der ASP.NET-Familie,
windows.developer

Weitere Infos

 

EAI und EDI in der Cloud ,
windows.developer

Weitere Infos

 

Verteilt und doch ein Ganzes: Verteilte Systeme mit AppFabric Applications,
dot.net magazin

Weitere Infos

 

Vorschau auf Neuerungen der kommenden WCF-Version,
dot.net magazin

Weitere Infos

 

Windows Azure Tutorial, Teil 3: Verbindung zwischen Cloud- und lokalen Applikationen,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

MVC, die dritte: ASP.NET MVC 3 RC 2,
dot.net magazin

Weitere Infos

 

Leichtgewichtiges O/R-Mapping - Code Only mit Entitiy Framework CTP 5,
dot.net magazin

Weitere Infos

 

Weitere Artikel

Training & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Schulungen und Beratung Unternehmen bei der Planung und Umsetzung von großer Software-Systeme.

Mehr lesen

In Kontakt treten

 
Konferenzen

BASTA! on Tour von 4/25/2012 bis 4/27/2012 in Düsseldorf

Meine Talks

Web-Site der Konferenz

 

BASTA! Spring 2012 von 2/27/2012 bis 3/2/2012 in Darmstadt

Meine Talks

Web-Site der Konferenz

 

ADC - Advanced Developers Conference von 10/26/2011 bis 10/27/2011 in Frankental (Deutschland)

Meine Talks

Web-Site der Konferenz

 

Scandev on tour von 10/18/2011 bis 10/18/2011 in Stockholm (Schweden)

Meine Talks

Web-Site der Konferenz

 

BASTA 2011 von 9/26/2011 bis 9/30/2011 in Mainz

Meine Talks

Web-Site der Konferenz

 

Jazoon - International Conference on the modern art of software von 6/21/2011 bis 6/23/2011 in Zürich

Meine Talks

Web-Site der Konferenz

 

Scandinavian Developer Conference 2011 von 4/4/2011 bis 4/5/2011 in Göteborg (Schweden)

Meine Talks

Web-Site der Konferenz

 

SOA-Days von 3/30/2011 bis 3/31/2011 in Bonn

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 4. January 2010 02:59

Dass C# 4 Unterstützung für dynamische Objekte bringen wird, dürfte dem einen oder anderen bereits bekannt sein. Damit soll das Zusammenspiel mit dynamischen Sprachen und COM sowie das Abbilden von dynamischen Domänen erleichtert werden.

Daneben wird jedoch auch die Möglichkeit geboten, eigene Klassen zu entwickeln, welche dynamische Member haben und somit erst zur Laufzeit aufgelöst werden. Das nachfolgend dargestellte Beispiel demonstriert dies, indem eine Instanz von Something erzeugt wird und dieser Werte für zwei bis dato nicht definierte (!) Eigenschaften zugewiesen werden. Danach werden diese wieder ausgelesen und auf der Konsole ausgegeben.

Anschließend werden mit einer Methode RegisterMethod zwei Delegates als Methoden definiert. Die Namen dieser neuen Methoden werden als String übergeben. Danach werden beiden Methode, wie herrkömmliche Methoden, aufgerufen. Im Anschluss daran, wird auch noch das Objekt als Methode behandelt und ausgeführt.
dynamic dontknow = new Something();

dontknow.X = 10;
dontknow.Y = 20;

Console.WriteLine(dontknow.X);
Console.WriteLine(dontknow.Y);

Func<int,int,int> add = (x,y) => x + y;
Func<int, int, int> sub = (x, y) => x - y;

dontknow.RegisterMethod("Add", add);
dontknow.RegisterMethod("Sub", sub);

Console.WriteLine(dontknow.Add(1,2));
Console.WriteLine(dontknow.Sub(1, 2));
Console.WriteLine(dontknow(1, 2));

 


Möglich wird dies, indem Something von DynamicObject erbt und dessen Methoden überschreibt. Diese Methoden werden von .Net immer dann aufgerufen, wenn bestimmte Aktionen mit dynamischen Membern durchgeführt werden sollen. Die Methode TrySetMember wird beispielsweise angestoßen, wenn eine dynamische Eigenschaft gesetzt werden soll; TrySetMember, wenn eine solche ausgelesen werden soll und TryInvokeMember wenn eine dynamische Methode zur Ausführung zu bringen ist. Wird, wie oben gezeigt, eine Instanz als Methode behandelt, delegiert das Framework an TryInvoke weiter.

Der gesamte Quellcode für dieses Beispiel findet sich nachfolgend.
class MethodNotFoundException : Exception
{
    public MethodNotFoundException(string message): base(message) { }
}

class Something : DynamicObject
{
    private Dictionary<String, dynamic> fields = new Dictionary<string, dynamic>();
    private Dictionary<String, Delegate> methods = new Dictionary<string, Delegate>();
    private Delegate firstMethod = null;

    public void RegisterMethod(String name, Delegate d)
    {
        if (methods.Count == 0) firstMethod = d;
        methods[name] = d;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = fields[binder.Name];
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        fields[binder.Name] = value;
        return true;
    }
   
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        if (!methods.ContainsKey(binder.Name)) {
            throw new MethodNotFoundException(binder.Name + " not found!");
        }
        result = methods[binder.Name].DynamicInvoke(args);
        return true;
    }

    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {

        if (firstMethod == null)
        {
            throw new MethodNotFoundException("No default method found!");
        }
        result = firstMethod.DynamicInvoke(args);
        return true;
    }

}

 

class Program
{
    static void Main(string[] args)
    {
        dynamic dontknow = new Something();

        dontknow.X = 10;
        dontknow.Y = 20;

        Console.WriteLine(dontknow.X);
        Console.WriteLine(dontknow.Y);

        Func<int,int,int> add = (x,y) => x + y;
        Func<int, int, int> sub = (x, y) => x - y;
       
        dontknow.RegisterMethod("Add", add);
        dontknow.RegisterMethod("Sub", sub);

        Console.WriteLine(dontknow.Add(1,2));
        Console.WriteLine(dontknow.Sub(1, 2));
        Console.WriteLine(dontknow(1, 2));

        Console.ReadLine();

    }
}

 

Kategorien: .Net 4