C# 从Func创建表达式

C# 从Func创建表达式,c#,generics,C#,Generics,我的代码中有一个Func。我使用它来选择某些属性 在调用另一个方法时,我需要Expression作为参数 有没有办法将Func转换(或创建)为Expression Thanx不能基于方法重新创建表达式,因为表达式需要知道原始语句,而不是IL。但是,您可以创建一个Expresson,对func进行方法调用,如: Func<int> func = () => 1; Expression<Func<int>> expression = Expression.L

我的代码中有一个
Func
。我使用它来选择某些属性

在调用另一个方法时,我需要
Expression
作为参数

有没有办法将
Func
转换(或创建)为
Expression


Thanx

不能基于方法重新创建表达式,因为表达式需要知道原始语句,而不是IL。但是,您可以创建一个Expresson,对func进行方法调用,如:

Func<int> func = () => 1;
Expression<Func<int>> expression = Expression.Lambda<Func<int>>(Expression.Call(func.Method));
Func=()=>1;
Expression=Expression.Lambda(Expression.Call(func.Method));
但是请注意,像EF这样的系统不能真正使用这个

虽然您可以创建一个调用委托的表达式树,但它不太可能有用,因为就分析表达式树的代码而言,委托基本上是一个黑盒。假设您正在尝试使用类似LINQ to SQL的东西,查询分析器将需要能够窥视您的逻辑以将其转换为SQL—如果它到达一个普通委托,它就不能这样做


您可能应该首先更改委托产生的代码,以创建表达式树。

您可以执行以下操作:

Func<object, string> func = a => a.ToString();
Expression<Func<object, string>> expr = a => func(a);
Func=a=>a.ToString();
表达式expr=a=>func(a);

但是,您将只得到一个包含对原始Func的方法调用的表达式。您将无法分析func本身的内容

您不能从委托创建表达式(从
Func
expression
),但您可以在站点上创建表达式

也就是说,通过编译将
表达式
转换为
Func
.compile

因此,如果您需要这两个表达式,您可以在函数中使用表达式,如果需要,可以在提供的集合对象上编译并执行它们


当然,我们必须注意,编译表达式的速度很慢。

但斯基特先生自然会把它说得比我好得多!:-)你这么说,但你的回答对我来说是有意义的,那是在往返机场的一夜之后的第二天早上。。。。非常简洁地重申了func是可以调用的东西,表达式是对func的调用。不过,假设您可以获得IL,您可以像Reflector和ILSpy一样反编译IL。(当然,不能保证这与编译IL的代码完全相同。)是否有方法获取委托的IL?我认为您可能需要在调用中添加func.Target。我用一个更复杂的Func尝试了这个方法,它抱怨我试图用null对象调用一个实例方法。我把它改为Expression.Call(Expression.Constant(func.Target)、func.Method、args),如果正确的话,all was fineEF可以使用它。看,这正是我需要的。只是想减少重复的代码。似乎我是从错误的角度来看的如果要避免代码重复,那么这是正确的解决方案可能重复