diff options
Diffstat (limited to 'src/CompilerServices/CompilerServices.cs')
| -rw-r--r-- | src/CompilerServices/CompilerServices.cs | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index ebb365c9..80b4d535 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -12,6 +12,8 @@ namespace Crow { public static class CompilerServices { + static MethodInfo miAddBinding = typeof(GraphicObject).GetMethod ("BindMember"); + public static void BuildInstanciator(IMLInstantiatorBuilder builder, Type crowType){ string tmpXml = builder.ReadOuterXml (); @@ -52,6 +54,8 @@ namespace Crow reader.il.Emit (OpCodes.Callvirt,//add child typeof(PrivateContainer).GetMethod ("SetChild", BindingFlags.Instance | BindingFlags.NonPublic)); } + reader.il.Emit (OpCodes.Ldloc_0); + reader.il.Emit (OpCodes.Callvirt, crowType.GetMethod ("ResolveBindings")); } } @@ -69,18 +73,26 @@ namespace Crow reader.il.Emit (OpCodes.Ldloc_0); reader.il.Emit (OpCodes.Callvirt, typeof(GraphicObject).GetMethod ("loadDefaultValues")); + MethodInfo miAddBinding = typeof(GraphicObject).GetMethod ("BindMember"); + while (reader.MoveToNextAttribute ()) { if (reader.Name == "Style") continue; - PropertyInfo pi = crowType.GetProperty (reader.Name); - + MemberInfo mi = crowType.GetMember (reader.Name).FirstOrDefault(); + if (mi == null) + throw new Exception ("Member '" + reader.Name + "' not found in " + crowType.Name); + if (mi.MemberType == MemberTypes.Event) { + emitBindingCreation (reader.il, reader.Name, reader.Value); + continue; + } + PropertyInfo pi = mi as PropertyInfo; if (pi == null) throw new Exception ("Member '" + reader.Name + "' not found in " + crowType.Name); - if (reader.Value.StartsWith("{")) - Debug.WriteLine("Binding => " + pi.Name + ": " + reader.Value); - else + if (reader.Value.StartsWith ("{")) { + emitBindingCreation (reader.il, reader.Name, reader.Value.Substring (1, reader.Value.Length - 2)); + }else CompilerServices.EmitSetValue (reader.il, pi, reader.Value); } @@ -96,6 +108,12 @@ namespace Crow } builder.il.Emit (OpCodes.Pop);//pop saved ref to current object } + static void emitBindingCreation(ILGenerator il, string memberName, string expression){ + il.Emit (OpCodes.Ldloc_0); + il.Emit (OpCodes.Ldstr, memberName); + il.Emit (OpCodes.Ldstr, expression); + il.Emit (OpCodes.Callvirt, miAddBinding); + } static void readChildren(IMLInstantiatorBuilder reader, Type crowType){ MethodInfo miAddChild = null; bool endTagReached = false; |