csharp Созданиеклассадинамически

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp Созданиеклассадинамически相关的知识,希望对你有一定的参考价值。

public static class Kata
    {
        private static ModuleBuilder _builder;
        private static ModuleBuilder BuildAssembly()
        {
            if (_builder != null)
                return _builder;
            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = "RuntimeAssembly";
            AppDomain thisDomain = Thread.GetDomain();
            var asmBuilder = thisDomain.DefineDynamicAssembly(
                assemblyName, AssemblyBuilderAccess.Run);
            var modBuilder = asmBuilder.DefineDynamicModule(
                asmBuilder.GetName().Name, false);
            _builder = modBuilder;
            return _builder;
        }


        public static bool DefineClass(string className, Dictionary<string, Type> properties, ref Type actualType)
        {
            var builder = BuildAssembly();
            var type = builder.GetType(className);
            if (type != null)
            {
                actualType = type;
                return false;
            }

            TypeBuilder typeBuilder = builder.DefineType(
                className,
                TypeAttributes.Public);

            foreach (KeyValuePair<string, Type> keyValuePair in properties)
            {
                var propertyName = keyValuePair.Key;
                string field = "_" + propertyName.ToLower();
                FieldBuilder fieldBldr = typeBuilder.DefineField(field, keyValuePair.Value, FieldAttributes.Private);
                PropertyBuilder propBldr =
                    typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, keyValuePair.Value, null);
                MethodAttributes getSetAttr =
                    MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;

                MethodBuilder getPropBldr =
                    typeBuilder.DefineMethod("get_" + propertyName, getSetAttr, keyValuePair.Value, Type.EmptyTypes);
                ILGenerator getIL = getPropBldr.GetILGenerator();
                getIL.Emit(OpCodes.Ldarg_0);
                getIL.Emit(OpCodes.Ldfld, fieldBldr);
                getIL.Emit(OpCodes.Ret);

                MethodBuilder setPropBldr = typeBuilder.DefineMethod("set_" + propertyName, getSetAttr, null,
                    new Type[] {keyValuePair.Value});
                ILGenerator setIL = setPropBldr.GetILGenerator();
                setIL.Emit(OpCodes.Ldarg_0);
                setIL.Emit(OpCodes.Ldarg_1);
                setIL.Emit(OpCodes.Stfld, fieldBldr);
                setIL.Emit(OpCodes.Ret);
                propBldr.SetGetMethod(getPropBldr);
                propBldr.SetSetMethod(setPropBldr);
            }

            actualType = typeBuilder.CreateType();
            return true;
        }
    }

以上是关于csharp Созданиеклассадинамически的主要内容,如果未能解决你的问题,请参考以下文章

csharp Cравнитьзначениепеременнойсданнымиизсписка,найтислово,делатьзамену

scss зацикленнаяанимациядляспиннера。 $ b $bСоздаемпсевдо-элемент。 Здесьдостаточнонавешиватькласснаоб

sql Созданиерандомногословаизрусскихбуквзаданнойдлины

csharp Узнаёмпортинстансадляподключениядебаггера

La Sylphide 仙女

sh Длякаждойсделаннойправкибезкоммитапоказатьизмененныйучастоккодаиспросить,должнолиэтоизменениепопа