【问题标题】:Property Name to Lambda Expression C#属性名称到 Lambda 表达式 C#
【发布时间】:2015-08-12 02:27:19
【问题描述】:

如何在 C# 中将属性名称转换为 Lambda 表达式?

像这样:string prop = "Name"; 到 (p => p.Name)

public class Person{
    public string Name{ get; set; } 
}

谢谢!

【问题讨论】:

  • lambda 表达式不是类型。您是指委托还是表达式树? 究竟是什么类型的?
  • 我不明白你的问题...你想把一个变量声明变成一个属性访问表达式?
  • 请解释您要达到的目标。将属性名称转换为 Lambda 并没有真正的意义。添加一些上下文。
  • 我在函数中有一个 Expression> 参数,而我只有属性名称,所以我需要将属性名称“转换”为 Expression。

标签: c# lambda


【解决方案1】:

使用表达式树,您可以生成 lambda 表达式。

using System.Linq.Expressions;
public static Expression<Func<T, object>> GetPropertySelector<T>(string propertyName)
{
    var arg = Expression.Parameter(typeof(T), "x");
    var property = Expression.Property(arg, propertyName);
    //return the property as object
    var conv = Expression.Convert(property, typeof(object));
    var exp = Expression.Lambda<Func<T, object>>(conv, new ParameterExpression[] { arg });
    return exp;
}

对于Person,你可以这样称呼它:

var exp = GetPropertySelector<Person>("Name");//exp: x=>x.Name

【讨论】:

  • 这不是反射
  • 这仅适用于字符串。有没有办法使 Expression.Lambda> 通用?我试过 Expression.Lambda> 但没有用。
  • 我已将其更改为支持泛型。
  • 我会说:“你可以使用表达式树”:D
  • @Hopeless:值类型需要转换,例如 int。没有它会抛出这个异常:“'System.Int32' 类型的表达式不能用于返回类型'System.Object'”
【解决方案2】:

lambda 只是一个匿名函数。您可以像常规方法一样将 lambdas 存储在委托中。我建议您尝试将“名称”设为属性。

public string Name { get { return p.Name; } }

如果您真的想要一个 lambda,请使用诸如 Func 之类的委托类型。

public Func&lt;string&gt; Name = () =&gt; p.Name;

【讨论】:

  • 是的,因为它没有名称来定义其位置。
  • 那么表达式树呢?他们也是代表吗? :P
  • 公平地说,我不熟悉表达式树(如果你在谈论 Linq 的 Expression 类),但我不认为它继承自 Delegate 或委托类型。
  • 他们不是代表。他们可以编译为代表
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 2021-12-09
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多