/// <summary> /// 创建一个新的动态方法 /// </summary> /// <param name="name">方法名字</param> /// <returns></returns> public static EasyEmitBuilder <DelegateType> NewDynamicMethod(string name) { if (string.IsNullOrEmpty(name)) { name = IncrementName.NextMethodName("DynamicMethod"); } else if (IncrementName.Contain(name)) { throw new Exception(string.Format("dynamic method {0} had been defined", name)); } var delType = typeof(DelegateType); var invoke = delType.GetMethod("Invoke"); var returnType = invoke.ReturnType; var parameters = invoke.GetParameters(); var parameterTypes = new List <Type>(parameters.Length); foreach (var p in parameters) { parameterTypes.Add(p.ParameterType); } var ret = new EasyEmitBuilder <DelegateType>(new DynamicMethod(name, returnType, parameterTypes.ToArray(), EmitBuilder.ModuleBuilder, true), parameterTypes.ToArray()); return(ret); }
/// <summary> /// 声明一个TypeBuilder /// </summary> /// <param name="namespace">命名空间</param> /// <param name="typeName">类名</param> /// <param name="attributes">类型特性</param> /// <param name="parent">父类</param> /// <param name="interfaces">实现的接口</param> /// <returns></returns> public static TypeBuilder NewTypeBuilder(string @namespace, string typeName, TypeAttributes attributes, Type parent, Type[] interfaces) { if (string.IsNullOrEmpty(@namespace)) { @namespace = "Never.CustomTypes."; } else { @namespace = @namespace.Trim('.'); @namespace = string.Concat(@namespace, "."); } @typeName = @typeName.Trim('.'); var fullTypeName = IncrementName.NextTypeName(@namespace, typeName.Trim('.').Replace("+", "_").Replace("<", "_").Replace(">", "_").Replace("~", "_")); return(EmitBuilder.ModuleBuilder.DefineType(fullTypeName, attributes, parent, interfaces)); }