如何在运行时创建该类的实例

普亚

我用Reflection.Emit我的代码在运行时编写了一些用于创建类和属性的方法

     public class DynamicLibraryProperties
        {
            public string PropName { get; set; }
            public Type PropType { get; set; }
            public string DefaultValue { get; set; }
        }

 public class GenerateDynamicClass
    {
        public static void GenerateLegacyStructureObject(string libraryName, string className, List<DynamicLibraryProperties> properties)
        {
            ILGenerator ilgen = default(ILGenerator);
            string library = string.Concat(libraryName, ".dll");
            AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(libraryName), AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule(libraryName, library);
            TypeBuilder legacyBuilder = modBuilder.DefineType(string.Concat(libraryName, ".", className), TypeAttributes.Class | TypeAttributes.Public);
            //Field Builder - Based on number of months add so many fields 
            foreach (DynamicLibraryProperties p in properties)
            {
                FieldBuilder field = legacyBuilder.DefineField(string.Concat("_", p.PropName), p.PropType, FieldAttributes.Private);
                PropertyBuilder nameProp = legacyBuilder.DefineProperty(p.PropName, PropertyAttributes.HasDefault, p.PropType, null);
                Type[] types = new Type[] { p.PropType };
                dynamic typeConvertor = TypeDescriptor.GetConverter(p.PropType);
                dynamic defaultValue = typeConvertor.ConvertFromString(p.DefaultValue);
                ConstructorInfo ctor = typeof(DefaultValueAttribute).GetConstructor(types);
                CustomAttributeBuilder customAttrib = new CustomAttributeBuilder(ctor, new object[] { defaultValue });
                nameProp.SetCustomAttribute(customAttrib);
                MethodAttributes getAttr = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName;
                MethodBuilder getNameBuilder = legacyBuilder.DefineMethod(string.Concat("get_", p.PropName), getAttr, p.PropType, Type.EmptyTypes);
                ilgen = getNameBuilder.GetILGenerator(); ilgen.Emit(OpCodes.Ldarg_0);
                ilgen.Emit(OpCodes.Ldfld, field);
                ilgen.Emit(OpCodes.Ret);
                MethodBuilder setNameBuilder = legacyBuilder.DefineMethod(string.Concat("set_", p.PropName), getAttr, null, new Type[] { p.PropType });
                ilgen = setNameBuilder.GetILGenerator();
                ilgen.Emit(OpCodes.Ldarg_0); 
                ilgen.Emit(OpCodes.Ldarg_1); 
                ilgen.Emit(OpCodes.Stfld, field); ilgen.Emit(OpCodes.Ret); 
                nameProp.SetGetMethod(getNameBuilder); 
                nameProp.SetSetMethod(setNameBuilder);
            } 
            Type objType = Type.GetType("System.Object");
            ConstructorInfo objCtor = objType.GetConstructor(Type.EmptyTypes);
            ilgen.Emit(OpCodes.Ldarg_0);
            ilgen.Emit(OpCodes.Call, objCtor);
            ilgen.Emit(OpCodes.Ret); 
            legacyBuilder.CreateType(); 
            asmBuilder.Save(library);
        }


    }

并使用这样的代码

 List<DynamicLibraryProperties> props = new List<DynamicLibraryProperties>();
            props.Add(new DynamicLibraryProperties
                          {
                              PropName = "201203", PropType = typeof(float),DefaultValue = "0"
                          });
            props.Add(new DynamicLibraryProperties { PropName = "201204", PropType = typeof(float) ,DefaultValue = "0"});

            GenerateDynamicClass.GenerateLegacyStructureObject("test", "test", props);

现在我想创建Test类的实例并为属性值设置值,但是我不知道该怎么做,请帮助我,谢谢大家。

斯里拉姆·萨克提维(Sriram Sakthivel)

您可以Activator.CreateInstance为此使用Type测试类。如下更改方法。

public static Type GenerateLegacyStructureObject(string libraryName, string className, List<DynamicLibraryProperties> properties)
{
    //your code
    Type t = legacyBuilder.CreateType(); 
    asmBuilder.Save(library);
    return t;
}

然后像这样使用它

Type testType = GenerateDynamicClass.GenerateLegacyStructureObject("test", "test", props);
object test = Activator.CreateInstance(testType);

希望这可以帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在运行时使用TypeTags创建类型T的实例

来自分类Dev

如何在运行时使用python动态创建新的类实例?

来自分类Dev

如何在运行时从ObservableCollection <T>派生的类的实例创建?

来自分类Dev

如何在运行时在Java中创建新添加的类的实例

来自分类Dev

如何在运行时选择Spring bean实例

来自分类Dev

如何在运行时更改实例类型

来自分类Dev

如何在运行时从C ++创建QQmlComponent?

来自分类Dev

如何在运行时递归创建ActionBar?

来自分类Dev

如何在运行时创建表达式

来自分类Dev

如何在运行时动态创建Predicate <T>

来自分类Dev

如何在运行时递归创建ActionBar?

来自分类Dev

如何在运行时创建表达式

来自分类Dev

Python如何在运行时创建类的方法

来自分类Dev

如何在运行时映射表创建?

来自分类Dev

Spring Boot @Autowired在运行时创建实例

来自分类Dev

在运行时按接口创建实例

来自分类Dev

如何实例化使用Javassist在运行时创建的类?

来自分类Dev

如何在运行时实例化Spring托管的bean?

来自分类Dev

Structuremap-如何在运行时获取命名实例并传递参数?

来自分类Dev

如何在运行时从Java对象获取实例变量的行号

来自分类Dev

如何在运行时更新Autofac容器中的注册实例

来自分类Dev

方法如何在运行时查找其对象的实例变量

来自分类Dev

如何在运行时创建的面板中创建组件?

来自分类Dev

如何在运行时运行php扩展

来自分类Dev

如何在运行时动态创建C#类(根据现有类)

来自分类常见问题

如何在运行时使用LambdaMetaFactory创建代理对象?

来自分类Dev

如何在运行时使用Spring创建请求范围的Bean

来自分类Dev

如何在运行时使用指定的参数名称创建函数?

来自分类Dev

如何在运行时在python中创建文件句柄?

Related 相关文章

  1. 1

    如何在运行时使用TypeTags创建类型T的实例

  2. 2

    如何在运行时使用python动态创建新的类实例?

  3. 3

    如何在运行时从ObservableCollection <T>派生的类的实例创建?

  4. 4

    如何在运行时在Java中创建新添加的类的实例

  5. 5

    如何在运行时选择Spring bean实例

  6. 6

    如何在运行时更改实例类型

  7. 7

    如何在运行时从C ++创建QQmlComponent?

  8. 8

    如何在运行时递归创建ActionBar?

  9. 9

    如何在运行时创建表达式

  10. 10

    如何在运行时动态创建Predicate <T>

  11. 11

    如何在运行时递归创建ActionBar?

  12. 12

    如何在运行时创建表达式

  13. 13

    Python如何在运行时创建类的方法

  14. 14

    如何在运行时映射表创建?

  15. 15

    Spring Boot @Autowired在运行时创建实例

  16. 16

    在运行时按接口创建实例

  17. 17

    如何实例化使用Javassist在运行时创建的类?

  18. 18

    如何在运行时实例化Spring托管的bean?

  19. 19

    Structuremap-如何在运行时获取命名实例并传递参数?

  20. 20

    如何在运行时从Java对象获取实例变量的行号

  21. 21

    如何在运行时更新Autofac容器中的注册实例

  22. 22

    方法如何在运行时查找其对象的实例变量

  23. 23

    如何在运行时创建的面板中创建组件?

  24. 24

    如何在运行时运行php扩展

  25. 25

    如何在运行时动态创建C#类(根据现有类)

  26. 26

    如何在运行时使用LambdaMetaFactory创建代理对象?

  27. 27

    如何在运行时使用Spring创建请求范围的Bean

  28. 28

    如何在运行时使用指定的参数名称创建函数?

  29. 29

    如何在运行时在python中创建文件句柄?

热门标签

归档