如何把匿名类型.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);
    }
  }
}

转自:http://www.cnblogs.com/0banana0/archive/2012/05/05/2484698.html

时间: 2024-12-17 14:53:57

如何把匿名类型.GetType()返回的对象传进泛型里面[转]的相关文章

C#3.0中的新增功能02 匿名类型

连载目录    [已更新最新开发文章,点击查看详细] 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用. 每个属性的类型由编译器推断. 可通过使用 new 运算符和对象初始值创建匿名类型. 有关对象初始值设定项的详细信息,请参阅对象和集合初始值设定项. 以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型. var v = new { Amount = 108, Mess

理解隐式类型、对象初始化程序和匿名类型

在C# 3.0中,几乎每个新特性都是为LINQ服务的.所以,本文将介绍下面几个在C# 3.0中引入的新特性: 自动实现的属性 隐式类型的局部变量 对象和集合初始化程序 隐式类型的数组 匿名类型 其实这几个特性都是比较容易理解的,对于这几个特性,编译器帮我们做了更多的事情(想想匿名方法和迭代器块),从而简化我们的代码. 自动实现的属性 在C# 3.0以前,当我们定义属性的时候,一般使用下面的代码 public class Book { private int _id; private string

Entity Framework 6 Recipes 2nd Edition(11-5)译 -&gt; 从”模型定义”函数返回一个匿名类型

11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型,如Figure 11-5所示. Figure 11-5. A model for hotel reservations 想要返回每位游客房间预订条数和带来的总收入.因为很多地方需要这些信息,所以想要创建一个”模型定义”函数,接受一个查询参数,返回一个包含游客合计信息的匿名类型的集合: 2. 把Li

匿名类型与Select方法实现自定义对象插入局部表结构中

在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITLE },这样的类型就叫匿名类型 var comdList = _menuMan.Load(c => c.FATHER_ID == null).OrderBy(c=>c.VAL_DISPLAYORDERID).Select(c=>new { c.SYS_COMMANDS_ID,c.TXT_CO

隐式类型、对象集合初始化、匿名类型

隐式类型和对象集合初始化器是在C# 3.0中引入的. 1 隐式类型 var关键字,主要还是编译器根据变量的值来推断其类型. 1.1隐式类型的局部变量 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var stringvariable="learning hard"; 6 stringvariable=2; 7 } 8 } 其实当你把鼠标放在var上面的时候,还是可以看到其类型的. 使用隐式类型时有一些限制,包括一

WebAPI 返回匿名类型

这是后台返回到前台的方法 public Object GetSomeThing() { return stubll.GetSomeThing(); } 在返回匿名类型时,通过Ajax可以直接获取到正确结果 但是当我直接在地址栏敲路径访问时,报错如下: "ObjectContent`1"类型未能序列化内容类型"application/xml; charset=utf-8"的响应正文. 我修改后台返回类型从Object换成IHttpActionResult,代码如下:

json字符串反序列化成匿名类型对象

添加第三方引用 using Newtonsoft.Json; /// <summary> /// 匿名类型解析 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonString"></param> /// <param name="anonymousTypeObject">

【C#复习总结】匿名类型由来

1 属性 这得先从属性开始说,为什么外部代码访问对象内部的数据用属性而不是直接访问呢,这样岂不是更方便一些,但是事实证明直接访问是不安全的.那么,Anders Hejlsberg(安德斯·海尔斯伯格)就为C#加入了属性这种语法糖,用起来跟数据成员一样,但实际上是 setXX()和getXX(),既安全又方便. 属性:是访问对象的首选方式,因为它们禁止外部代码访问对象内部的数据存储机制的实现. public int MyIntProp { get { //property get code } s

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员