Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq ';参数表达式无效';动态创建匿名类型时_Linq_Expression Trees_Typebuilder - Fatal编程技术网

Linq ';参数表达式无效';动态创建匿名类型时

Linq ';参数表达式无效';动态创建匿名类型时,linq,expression-trees,typebuilder,Linq,Expression Trees,Typebuilder,我正在创建一个表达式树生成器来返回自定义匿名类型。我首先尝试使用离散类型,它工作正常,但在运行时使用TypeBuilder生成类型并将该类型传递给表达式树失败,出现此错误 'Argument expression is not valid' 以下是我使用的代码: 此方法用于创建匿名类型 private Type CreateAnonymousType(Dictionary<string, Type> properties) { AssemblyName dyna

我正在创建一个表达式树生成器来返回自定义匿名类型。我首先尝试使用离散类型,它工作正常,但在运行时使用TypeBuilder生成类型并将该类型传递给表达式树失败,出现此错误

'Argument expression is not valid'
以下是我使用的代码:

此方法用于创建匿名类型

private Type CreateAnonymousType(Dictionary<string, Type> properties)
    {
      AssemblyName dynamicAssemblyName = new AssemblyName("MyAssembly");
      AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder dynamicModule = dynamicAssembly.DefineDynamicModule("MyAssembly");

      TypeBuilder dynamicAnonymousType = dynamicModule.DefineType("ReturnType", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass);
      foreach (var p in properties)
      {
        dynamicAnonymousType.DefineField(p.Key, p.Value, FieldAttributes.Public);
      }

      return dynamicAnonymousType.CreateType();
    }
私有类型CreateAnonymousType(字典属性)
{
AssemblyName dynamicAssemblyName=新的AssemblyName(“MyAssembly”);
AssemblyBuilder DynamicCasSembly=AssemblyBuilder.DefinedDynamicAssembly(DynamicCasSemblyName,AssemblyBuilderAccess.Run);
ModuleBuilder dynamicModule=dynamicAssembly.defineddynamicmodule(“MyAssembly”);
TypeBuilder DynamicAnonyCustomType=dynamicModule.DefineType(“ReturnType”,TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass);
foreach(属性中的var p)
{
DynamicAnyCustomType.DefineField(p.Key、p.Value、FieldAttributes.Public);
}
返回dynamicanyCustomType.CreateType();
}
下面是我如何创建表达式树的

var cars = new List<Car>();
      for (int i = 0; i < 10; i++)
      {
        cars.Add(new Car { Id = i, Name = "Car " + i, Age = 2010 + i });
      }


      IQueryable<Car> allCars = cars.AsQueryable();

      var properties = new Dictionary<string, Type>
      {
        { "Id", typeof(int) },
        { "Name", typeof(string) }
      };

      ParameterExpression x = Expression.Parameter(typeof(Car), "x");
      var listMembers = properties.Select(p => Expression.Property(x, p.Key));

      var returnType = CreateAnonymousType(properties);
      object destObject = Activator.CreateInstance(returnType);


      var listBind = listMembers.Select(p => Expression.Bind(returnType.GetField(p.Member.Name), p));

      var result = Expression.New(returnType);
      var initExp = Expression.MemberInit(result, listBind.ToArray());


      var call = Expression.Call(typeof(Queryable), "Select",
          new Type[] {
            typeof(Car),
            returnType
        }
        , Expression.Constant(allCars)
        , Expression.Lambda(initExp, x));

      var qResult = allCars.Provider.CreateQuery<IdName>(call);

      foreach (var car in qResult)
      {
        Console.WriteLine(car.Id + " - " + car.Name);
      }
var cars=新列表();
对于(int i=0;i<10;i++)
{
添加(新车{Id=i,Name=“Car”+i,年龄=2010+i});
}
IQueryable allCars=cars.AsQueryable();
var属性=新字典
{
{“Id”,typeof(int)},
{“名称”,类型(字符串)}
};
ParameterExpression x=表达式参数(类型(Car),“x”);
var listMembers=properties.Select(p=>Expression.Property(x,p.Key));
var returnType=CreateAnonymousType(属性);
object destObject=Activator.CreateInstance(returnType);
var listBind=listMembers.Select(p=>Expression.Bind(returnType.GetField(p.Member.Name),p));
var结果=表达式.New(返回类型);
var initExp=Expression.MemberInit(result,listBind.ToArray());
var call=Expression.call(typeof(Queryable),“选择”,
新类型[]{
车辆类型,
返回型
}
,表达式.常量(所有车)
,表达式.Lambda(initExp,x));
var qResult=allCars.Provider.CreateQuery(调用);
foreach(qResult中的var car)
{
Console.WriteLine(car.Id+“-”+car.Name);
}

CreateQuery方法执行时出错,这是因为
call
返回动态创建的
ReturnType
not
IdName
,因此异常。此外,您不能将诸如
ReturnType
之类的动态类型作为泛型类型参数,因为编译器对它们一无所知,所以您应该改用
dynamic
,以便在运行时解析该类型:

var qResult = allCars.Provider.CreateQuery<dynamic>(call);
var qResult=allCars.Provider.CreateQuery(调用);