C# 如何在Linq表达式中使用Expression.MakeIndex?
属性索引器数组 正在尝试动态生成以下lambda表达式: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
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的结果分配给一个变量以实际使用它。。。