如何解决MemberExpression.ToString-替换参数
使用此方法:
public static string GetMemberIdentifier<TProp>(Expression<Func<Team,TProp>> expression)
{
return expression.Body.ToString();
}
lambda表达式可以转换为字符串表示形式:
var nameIdentifier1 = GetMemberIdentifier(t => t.Members[1].Name);
给出(a):
t.Members.get_Item(1).Name
但是用以下方式调用它:
var i = 0;
var nameIdentifier2 = GetMemberIdentifier(t => t.Members[i].Name);
得出(b):
t.Members.get_Item(value(Program+<>c__DisplayClass2).i).Name
是否可以使b)中的输出与a)中的输出相同?
.NET小提琴:https://dotnetfiddle.net/cHG7H3
所需用法(简化):
for(int i = 0; i < team.Members.Count; i++)
{
Console.WriteLine(GetMemberIdentifier(t => t.Members[i].Name));
}
输出:
t.Members.get_Item(0).Name
t.Members.get_Item(1).Name
t.Members.get_Item(2).Name
解决方法
如果您的lambda变得如此简单,则可以执行以下操作:
public class ArgumentsTransformToConstantVisitor : ExpressionVisitor
{
private readonly Dictionary<string,Func<object>> args;
public ArgumentsTransformToConstantVisitor(params (string varname,Func<object> resolver)[] args)
{
this.args = args.ToDictionary(i => i.varname,i => i.resolver);
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Expression is ConstantExpression && this.args.TryGetValue(node.Member.Name,out Func<object> resolver))
return Expression.Constant(resolver());
return base.VisitMember(node);
}
public string GetMemberIdentifier<TProp>(Expression<Func<Team,TProp>> expression)
{
return ((LambdaExpression)this.Visit(expression)).ToString();
}
}
int i = 0;
var visitor = new ArgumentsTransformToConstantVisitor(("i",() => i));
for (i = 0; i < 5; i++)
{
Console.WriteLine(visitor.GetMemberIdentifier(t => t.Members[i].Name));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。