博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何把匿名类型.GetType()返回的对象传进泛型里面
阅读量:6868 次
发布时间:2019-06-26

本文共 3877 字,大约阅读时间需要 12 分钟。

//怎么取得匿名类型的Type放到//泛型T当中??var 匿名 = new { A = 0, B = 1 };Type t = 匿名.GetType();//然后下面var xx = dbContext.Database.SqlQuery
("sql");//就悲剧了var xx2 = dbContext.Database.SqlQuery
("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);    }  }}

转载地址:http://wndfl.baihongyu.com/

你可能感兴趣的文章
Storm概念学习系列 之Worker工作者进程
查看>>
C# 类的多态、结构、接口、抽象、虚函数总结
查看>>
tomcat添加https
查看>>
IntelliJ IDEA导航特性Top20
查看>>
simplify-path
查看>>
Nginx系列3之Nginx+tomcat
查看>>
PHP socket编程需要了解的一些基本知识
查看>>
DotNet程序配置文件
查看>>
C#基础第五天-作业答案-用DataTable制作名片集
查看>>
转: Eclipse 分屏显示同一个文件
查看>>
Selenium2+python自动化15-select下拉框
查看>>
Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
查看>>
如果觉得配置文件没有错,但web-dev-server总是报错,可以在hosts文件里加一行127.0.0.1 localhost...
查看>>
【转】分享8年开发经验,浅谈个人发展经历,明确自己发展方向
查看>>
If you only do what you can do you'll never be more than you are now.
查看>>
详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能...
查看>>
JavaScript获取浏览器类型与版本
查看>>
STM32普通定时器(TIM2-7)的时钟源
查看>>
[Android]使用Dagger 2进行依赖注入 - Producers(翻译)
查看>>