Ok, ich habe jetzt mal versucht Klassen und Funktionen mit Hilfe von Reflections an JS durch zu reichen. Es funktioniert zwar, doch leider ist IronJS noch nicht wirklich ausgereift
Hier mal eine Beispiel-Klasse
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
[JavaScript("Hero")]
public class Hero
{
public Hero(String name)
{
this.Name = name;
}
[JavaScript("name")]
public String Name
{
set;
get;
}
[JavaScript("onHit")]
public FunctionObject OnHit
{
set;
get;
}
public override string ToString()
{
return "I am a hero and my name is " + this.Name;
}
[JavaScript("say")]
public void Say(String message)
{
Console.WriteLine(this.Name + ": " + message);
}
[JavaScript("hit")]
public void Hit(CommonObject self, Double damage)
{
this.OnHit.Call(self, damage);
}
[JavaScript("sayYourName")]
public void SayYourName()
{
Console.WriteLine("My name is " + this.Name);
}
[JavaScript("prototypeTest")]
public static void PrototypeTest(ObjectProxy hero)
{
Console.WriteLine("prototype to static method: " + hero.Get<String>("name"));
}
}
|
Hier der Aufruf:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
ScriptContext script = new ScriptContext();
script.PublishAssembly(Assembly.GetCallingAssembly());
//script.PublishClass(typeof(Hero));
script.Execute(
@"
var hero1 = Hero('Foo');
var hero2 = Hero('Bar');
puts('initial name: ' + hero1.name);
puts('initial name: ' + hero2.name);
hero1.name = 'Uber Foo';
hero2.name = 'Uber Bar';
puts('changed name: ' + hero1.name);
puts('changed name: ' + hero2.name);
hero1.sayYourName();
hero2.sayYourName();
hero1.onHit = function(damage) {
hero1.say('ouch! lost ' + damage + 'hp');
};
hero1.hit(10);
Hero.prototypeTest(hero1);
inspect(hero1);
inspect(hero2);
"
);
|
Und hier die Ausgabe
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
|
initial name: Foo
initial name: Bar
changed name: Uber Foo
changed name: Uber Bar
My name is Uber Foo
My name is Uber Bar
Uber Foo: ouch! lost 10hp
prototype to static method: Uber Foo
I am a hero and my name is Uber Foo
I am a hero and my name is Uber Bar
|
IronJS ist jetzt komplett gekapselt hinter dem ScriptContext welches hinter der Bühne mittelst Reflection die wildesten Sachen macht damit das funktioniert :lol:
Wenn IronJS ausgereifter ist und ich es in meinem Projekt erfolgreich benutze, werde ich es auf GitHub veröffentlichen.