如何把匿名類型.GetType()返回的對象傳進泛型里面


//怎么取得匿名類型的Type放到
//泛型T當中??

var 匿名 = new {
 A = 0,
 B = 1 };
Type t = 匿名.GetType();

//然后下面
var xx = dbContext.Database.SqlQuery<t>("sql");
//就悲劇了

var xx2 = dbContext.Database.SqlQuery<dynamic>("sql");
//xx2有列表,但是都是Object..~~~無法顯示真實項,用Profile跟..SQL確實提交了.
求解釋

msdn大神的解決辦法

看到了所以記錄下來

出現那個問題的原因是動態類型上沒有 Entity Framework 需要的屬性定義,Entity Framework 是通過反射類型上的屬性來做映射的。為了解決這個問題,我用到了 Emit 技術,動態產生一個類型,並且動態寫入 IL 代碼產生屬性。

代碼如下,測試在 C# 4.0 上通過。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Collections;
using System.Reflection.Emit;
using System.Reflection;
 
namespace Demo
{
  public class Program
  {
    public static void Main(string[] args)
    {
      string connectionString = "Server=(local); Integrated Security=true; Database=master";
      using (DbContext context = new DbContext(connectionString))
      {
        TypeBuilder builder = Program.CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType");
        Program.CreateAutoImplementedProperty(builder, "name", typeof(string));
        Program.CreateAutoImplementedProperty(builder, "type", typeof(string));
        Program.CreateAutoImplementedProperty(builder, "id", typeof(int));
 
        Type resultType = builder.CreateType();
 
        dynamic queryResult = context.Database.SqlQuery(resultType, "SELECT * FROM sys.sysobjects");
 
        Console.WriteLine("{0,20} {1,4} {2,10}", "Name", "Type", "ID");
        foreach (dynamic item in queryResult)
        {
          Console.WriteLine("{0,10} {1,4} {2,10}", item.name, item.type, item.id);
        }
      }
 
      Console.ReadKey();
    }
 
    public static TypeBuilder CreateTypeBuilder(string assemblyName, string moduleName, string typeName)
    {
      TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Run).DefineDynamicModule(moduleName).DefineType(typeName, TypeAttributes.Public);
      typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
      return typeBuilder;
    }
 
    public static void CreateAutoImplementedProperty(TypeBuilder builder, string propertyName, Type propertyType)
    {
      const string PrivateFieldPrefix = "m_";
      const string GetterPrefix = "get_";
      const string SetterPrefix = "set_";
 
      // Generate the field.
      FieldBuilder fieldBuilder = builder.DefineField(string.Concat(PrivateFieldPrefix, propertyName), propertyType, FieldAttributes.Private);
 
      // Generate the property
      PropertyBuilder propertyBuilder = builder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
 
      // Property getter and setter attributes.
      MethodAttributes propertyMethodAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
 
      // Define the getter method.
      MethodBuilder getterMethod = builder.DefineMethod(string.Concat(GetterPrefix, propertyName), propertyMethodAttributes, propertyType, Type.EmptyTypes);
 
      // Emit the IL code.
      // ldarg.0
      // ldfld,_field
      // ret
      ILGenerator getterILCode = getterMethod.GetILGenerator();
      getterILCode.Emit(OpCodes.Ldarg_0);
      getterILCode.Emit(OpCodes.Ldfld, fieldBuilder);
      getterILCode.Emit(OpCodes.Ret);
 
      // Define the setter method.
      MethodBuilder setterMethod = builder.DefineMethod(string.Concat(SetterPrefix, propertyName), propertyMethodAttributes, null, new Type[] { propertyType });
 
      // Emit the IL code.
      // ldarg.0
      // ldarg.1
      // stfld,_field
      // ret
      ILGenerator setterILCode = setterMethod.GetILGenerator();
      setterILCode.Emit(OpCodes.Ldarg_0);
      setterILCode.Emit(OpCodes.Ldarg_1);
      setterILCode.Emit(OpCodes.Stfld, fieldBuilder);
      setterILCode.Emit(OpCodes.Ret);
 
      propertyBuilder.SetGetMethod(getterMethod);
      propertyBuilder.SetSetMethod(setterMethod);
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM