是的,這正是你想要的 - 並使用Expression.Property
是做到這一點的最簡單的方法:我認爲,應該沒關係
Expression func = Expression.Property(existingFunc.Body, "Month");
Expression<Func<T, int>> lambda =
Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters);
。它在這個簡單的測試中工作:
using System;
using System.Linq.Expressions;
class Person
{
public DateTime Birthday { get; set; }
}
class Test
{
static void Main()
{
Person jon = new Person
{
Birthday = new DateTime(1976, 6, 19)
};
Expression<Func<Person,DateTime>> dateTimeExtract = p => p.Birthday;
var monthExtract = ExtractMonth(dateTimeExtract);
var compiled = monthExtract.Compile();
Console.WriteLine(compiled(jon));
}
static Expression<Func<T,int>> ExtractMonth<T>
(Expression<Func<T,DateTime>> existingFunc)
{
Expression func = Expression.Property(existingFunc.Body, "Month");
Expression<Func<T, int>> lambda =
Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters);
return lambda;
}
}
我在哪裏可以得到您正在使用的表達式樹查看器?它適用於Visual Studio 2010嗎? – MartinF 2010-11-17 02:35:56
它附帶Linq樣品。這裏有一個很好的例子http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx我避難所在Studio 2010中沒有嘗試過,但我知道它在2008年有效。 – Adam 2010-11-17 02:58:15