2014-12-02 56 views
0

我动态生成了一个类,我想在泛型方法中使用此类。如何在通用方法中使用类生成的动态

,如果我能在我的项目代码中动态生成类或这个类的DLL添加到我的项目bin文件夹,并访问它在我的代码

// This Method Create Class 
var myNewClass = MyTypeBuilder.CompileResultType(); 

// I Needed To Use This Class In Generic 
List<myNewClass> returnObj = GetData(); 

// MyTypeBuilder Class Which I Used To Generate Class 

public class MyTypeBuilder 
{ 
    public static void CreateNewObject() 
    { 
     var myType = CompileResultType(); 
     var myObject = Activator.CreateInstance(myType); 
    } 

    static Dictionary<string, Type> _props = new Dictionary<string, Type>() { 
      { "Id", typeof(string) }, 
      { "Name", typeof(string) }, 
      /*{ "ProductLists", typeof(string[]) }*/ 
     }; 

    public static Type CompileResultType() 
    { 
     TypeBuilder tb = GetTypeBuilder(); 
     ConstructorBuilder constructor = tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName); 

     // NOTE: assuming your list contains Field objects with fields FieldName(string) and FieldType(Type) 

     foreach (var field in _props) 
      CreateProperty(tb, field.Key, field.Value); 

     Type objectType = tb.CreateType(); 
     return objectType; 
    } 

    private static TypeBuilder GetTypeBuilder() 
    { 
     var typeSignature = "MyDynamicType"; 
     var an = new AssemblyName(typeSignature); 
     AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run); 
     ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); 
     TypeBuilder tb = moduleBuilder.DefineType(typeSignature 
          , TypeAttributes.Public | 
          TypeAttributes.Class | 
          TypeAttributes.AutoClass | 
          TypeAttributes.AnsiClass | 
          TypeAttributes.BeforeFieldInit | 
          TypeAttributes.AutoLayout 
          , null); 
     return tb; 
    } 

    private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType) 
    { 
     FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private); 

     PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null); 
     MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes); 
     ILGenerator getIl = getPropMthdBldr.GetILGenerator(); 

     getIl.Emit(OpCodes.Ldarg_0); 
     getIl.Emit(OpCodes.Ldfld, fieldBuilder); 
     getIl.Emit(OpCodes.Ret); 

     MethodBuilder setPropMthdBldr = 
      tb.DefineMethod("set_" + propertyName, 
       MethodAttributes.Public | 
       MethodAttributes.SpecialName | 
       MethodAttributes.HideBySig, 
       null, new[] { propertyType }); 

     ILGenerator setIl = setPropMthdBldr.GetILGenerator(); 
     Label modifyProperty = setIl.DefineLabel(); 
     Label exitSet = setIl.DefineLabel(); 

     setIl.MarkLabel(modifyProperty); 
     setIl.Emit(OpCodes.Ldarg_0); 
     setIl.Emit(OpCodes.Ldarg_1); 
     setIl.Emit(OpCodes.Stfld, fieldBuilder); 

     setIl.Emit(OpCodes.Nop); 
     setIl.MarkLabel(exitSet); 
     setIl.Emit(OpCodes.Ret); 

     propertyBuilder.SetGetMethod(getPropMthdBldr); 
     propertyBuilder.SetSetMethod(setPropMthdBldr); 
    } 
} 
+1

将通用对象绑定到未知类型没有意义。只需使用'List ' – dcastro 2014-12-02 10:15:46

+0

您遇到的实际问题是什么?而且,在合理的时间内,这是太多的代码才能理解。 – usr 2015-01-01 20:06:48

回答

0

尝试List<dynamic> returnObj = GetData();

泛型类型参数解析在编译时,所以不可能将在运行时动态构建的类型用作参数。

你可以使用dynamic来解决这个问题,但我确定你为什么需要运行时类型构建器,如果你可以使用动态的话。

在您提供的示例中,可能只需简单var returnObj = GetData();即可。

相关问题