Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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
C# 如何在Linq表达式中使用Expression.MakeIndex?_C#_.net_Linq_Expression - Fatal编程技术网

C# 如何在Linq表达式中使用Expression.MakeIndex?

C# 如何在Linq表达式中使用Expression.MakeIndex?,c#,.net,linq,expression,C#,.net,Linq,Expression,属性索引器数组 正在尝试动态生成以下lambda表达式: Expression<Func<Program, string>> y = _ => _.x[0]; var instance = new ProgramZ { x = new List<string> { "a", "b" } }; Console.WriteLine(expr.Compile().Invoke(instance)); 异常消息: 为方法调用提供的参数数量不正确 'Syst

属性索引器数组

正在尝试动态生成以下lambda表达式:

Expression<Func<Program, string>> y = _ => _.x[0];
var instance = new ProgramZ { x = new List<string> { "a", "b" } };

Console.WriteLine(expr.Compile().Invoke(instance));
异常消息:

为方法调用提供的参数数量不正确 'System.Collections.Generic.List'1[System.String]get\x'


我该如何纠正这一点?

这里有两个操作:

从参数中获取x 访问索引0处的项目 您需要为此创建两个单独的表达式:

var property = Expression.Property(parameter, typeof (Program).GetProperty("x"));
var itemAtPosition0 = Expression.MakeIndex(property, typeof(List<string>).GetProperty("Item"),
                     new [] { Expression.Constant(0) });

项引用索引器属性的默认名称。有关此名称以及如何可靠地检测实际使用的名称的更多信息,请参阅。

此答案假设程序类的定义如下:

public class ProgramZ
{
    public List<string> x { get; set; }
}
下面是如何调用表达式:

Expression<Func<Program, string>> y = _ => _.x[0];
var instance = new ProgramZ { x = new List<string> { "a", "b" } };

Console.WriteLine(expr.Compile().Invoke(instance));

正如预期的那样,此代码将输出一个异常。

似乎正在反弹异常。好吧,你似乎忘记告诉我们哪一个-以及它包含什么消息…谢谢,链接还回答了我的另一个问题-如果它总是要成为一个项目,为什么要创建一个参数,你可以传递另一个名称。谢谢你的解决方案-在几个小时的尝试后工作得很好。然而,直到我重新分配回property=Expression.make时,它才起作用。。。。如果您能更新答案,我将不胜感激。是的,显然您需要将MakeIndex的结果分配给一个变量以实际使用它。。。