2014-12-02 45 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();即可。

相關問題