C# 如何创建表达式<;Func<;对象>&燃气轮机;从属性名开始
我想创建如下表达式:C# 如何创建表达式<;Func<;对象>&燃气轮机;从属性名开始,c#,linq,linq-expressions,C#,Linq,Linq Expressions,我想创建如下表达式: public class Entity { public virtual long Id { get; set; } } Entity alias = null; Expression<Func<object>> target = () => alias.Id;//have to be created from "Id" 公共类实体 { 公共虚拟长Id{get;set;} } 实体别名=null; 表
public class Entity
{
public virtual long Id { get; set; }
}
Entity alias = null;
Expression<Func<object>> target = () => alias.Id;//have to be created from "Id"
公共类实体
{
公共虚拟长Id{get;set;}
}
实体别名=null;
表达式目标=()=>alias.Id//必须从“Id”创建
我的问题是如何以编程方式创建
表达式目标,其中包含属性名为字符串(本例中为“Id”)的字符串。好的,我希望,我终于理解了,您需要什么:)
我建议创建这样的扩展方法:
public static class EntityExtensions
{
public static Expression<Func<object>> ToExpression(this Entity entity, string property)
{
var constant = Expression.Constant(entity);
var memberExpression = Expression.Property(constant, property);
Expression convertExpr = Expression.Convert(memberExpression, typeof(object));
var expression = Expression.Lambda(convertExpr);
return (Expression<Func<object>>)expression;
}
}
您必须将实体作为参数
否决接受答案的人可以解释问题所在。您是否尝试过基于反射的工厂?看看。表达式是您想要的吗?实体
来自应用程序(不是表达式的输入),其Id
属性是long
而不是对象
。表达式是否更有用?例如:expressiontarget=a=>a.Id代码>我确实想使用表达式树,但我只开始使用它们为什么不简单地使用名称(Entity.Id)
?谢谢,但我确实需要表达式
,因为我想将它传递给另一个只能接受表达式的方法(它是NHibernate的别名方法)抱歉,但是我不需要Expression
而是Expression
。就像这样:()=>alias.Id
如果这是所需的方法,您可以将此实体
替换为此T源
,以使此方法可用于所有类型的对象。非常感谢。这正是我需要的!
var entity = new Entity { Id = 4711 };
var expression = entity.ToExpression("Id");
var result = expression.Compile().DynamicInvoke();