2 using System.Collections.Generic;
4 using System.Reflection;
7 using MethodAttributes = Mono.Cecil.MethodAttributes;
8 using MethodImplAttributes = Mono.Cecil.MethodImplAttributes;
10 namespace Tizen.NUI.Xaml.Build.Tasks
12 static class TypeDefinitionExtensions
14 public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType)
16 var module = targetType.Module;
17 var parentType = module.ImportReference(("mscorlib", "System", "Object"));
19 return AddDefaultConstructor(targetType, parentType);
22 public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, TypeReference parentType)
24 var module = targetType.Module;
25 var voidType = module.ImportReference(("mscorlib", "System", "Void"));
26 var methodAttributes = MethodAttributes.Public |
27 MethodAttributes.HideBySig |
28 MethodAttributes.SpecialName |
29 MethodAttributes.RTSpecialName;
31 var parentctor = module.ImportCtorReference(parentType, paramCount: 0) ?? module.ImportCtorReference(("mscorlib", "System", "Object"), parameterTypes: null);
33 var ctor = new MethodDefinition(".ctor", methodAttributes, voidType)
35 CallingConvention = MethodCallingConvention.Default,
36 ImplAttributes = (MethodImplAttributes.IL | MethodImplAttributes.Managed)
38 ctor.Body.InitLocals = true;
40 var IL = ctor.Body.GetILProcessor();
42 IL.Emit(OpCodes.Ldarg_0);
43 IL.Emit(OpCodes.Call, parentctor);
46 targetType.Methods.Add(ctor);
50 public static IEnumerable<MethodDefinition> AllMethods(this TypeDefinition self)
54 foreach (var md in self.Methods)
56 self = self.BaseType == null ? null : self.BaseType.ResolveCached();
60 public static FieldDefinition GetOrCreateField(this TypeDefinition self, string name, Mono.Cecil.FieldAttributes attributes, TypeReference fieldType)
62 var field = self.Fields.FirstOrDefault(a => a.Name == name);
66 field = new FieldDefinition(name, attributes, fieldType);
67 self.Fields.Add(field);
73 public static MethodDefinition GetOrCreateMethod(this TypeDefinition self, string name, MethodAttributes attributes, Type type)
75 MethodDefinition method = self.Methods.FirstOrDefault(a => a.Name == name);
78 method = new MethodDefinition(name, MethodAttributes.Public, self.Module.ImportReference(type));
79 self.Methods.Add(method);