gpt4 book ai didi

c# - Lambda 属性名称和数组索引

转载 作者:行者123 更新时间:2023-11-30 12:18:42 27 4
gpt4 key购买 nike

对于以下 Lambda 表达式:

GetPropertyNameAndArrayIndex(() => SomeArray[0])

我知道你可以获得 property name一个表达。我还知道您可以通过使用 ConstantExpression 并访问正确的值来获取数组索引。我的问题是当数组索引(或右值)不是常量时,您如何获得它,即,

for (int i = 0; i < 5; i++)
{
GetPropertyNameAndArrayIndex(() => SomeArray[i])
}

如有任何帮助,我们将不胜感激。

最佳答案

如评论中所述;请注意,给出的示例容易受到捕获变量问题的影响如果异步使用 - 但“按原样”可能没问题。

要彻底做到这一点涉及很多边缘情况(或者你可以作弊并使用 Compile()) - 但这里有一个显示整体主题的示例(不使用 Compile):

using System;
using System.Linq.Expressions;
using System.Reflection;
class Program
{
static void Main()
{
string[] arr = { "abc", "def" };
for (int i = 0; i < arr.Length; i++)
{
Foo(() => arr[i]);
}
}
static object Foo<T>(Expression<Func<T>> lambda)
{
object obj = Walk(lambda.Body);
Console.WriteLine("Value is: " + obj);
return obj;

}
static object Walk(Expression expr)
{
switch (expr.NodeType)
{
case ExpressionType.ArrayIndex:

BinaryExpression be = (BinaryExpression)expr;
Array arr = (Array)Walk(be.Left);
int index = (int) Walk(be.Right);
Console.WriteLine("Index is: " + index);
return arr.GetValue(index);
case ExpressionType.MemberAccess:
MemberExpression me = (MemberExpression)expr;
switch (me.Member.MemberType)
{
case MemberTypes.Property:
return ((PropertyInfo)me.Member).GetValue(Walk(me.Expression), null);
case MemberTypes.Field:
return ((FieldInfo)me.Member).GetValue(Walk(me.Expression));
default:
throw new NotSupportedException();
}
case ExpressionType.Constant:
return ((ConstantExpression) expr).Value;
default:
throw new NotSupportedException();

}
}

}

关于c# - Lambda 属性名称和数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1522338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com