Example #1
0
        /// <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);
        }
Example #2
0
        /// <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));
        }