I en tidligere post så vi hvor nemt det var at komme igang med IronPython og jeg håber det kom frem at det virkligt er mærkbart nemmere end at skulle til at bruge C#/VB.Net som scriptsprog. Hvis ikke så prøv at forklar dig selv hvordan et enkelt delegate kald (som f.eks. add(2, 3)) skal wrappes for at køre som C# script. Eller hvor meget reflection du skal bruge for at få adgang til en delegate eller kallse du har definere i dit script.

Nu vil jeg forsøge at beskrive det sidste i IronPython, altså hvordan man kan bruge Python klasser i C#. Vi begynder med at definere en simpel Python klasse.

class MyClass(object):
    def add(self, a, b): return a + b

Når koden er kørt vil vores scope indeholde en variabel med navnet på klassen, her MyClass.

object myClass = scope.GetVariable("MyClass"); 

Dette er klassedefinition som vi skal bruge til at oprette en ny instans of klassen og til at kalde methoder på klassen. Vi skal også bruge ObjectOperations fra vores engine.

ObjectOperations op = engine.Operations; 

Herefter er det bare at gå igang med at oprette en instans, finde methoden og kalden metoden:

object instance = op.Call(myClass);
object method = op.GetMember(instance, "add");
int sum = (int)op.Call(method, 2, 3);

Hvis sum ikke er 5, så gik det galt (and you're on your own). Det var det. Måske nogle kan genkende et mønster fra IDispatch.Invoke, eller der det bare mig der fik et deja-vu. Med dynamic i C# 4.0 skulle det blive meget nemmere med disse operationer, fordi det er speciel designet til at kode op mod f.eks. Office objekt modellen, men det ser vi på til den tid.

Kommentarerne er lukkede