解析入口參數(shù)為實(shí)體的表達(dá)式樹
在學(xué)習(xí)LINQ的時(shí)候碰到了解析表達(dá)式樹的問題,書上的例子中入口參數(shù)為一個(gè)單一變量,這個(gè)在MSDN中給出了示例代碼:
MSDN官方示例:
// Add the following using directive to your code file:
// using System.Linq.Expressions;
// Create an expression tree.
Expression<Func<int, bool>> exprTree = num => num <5;
// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
param.Name, left.Name, operation.NodeType, right.Value);
// This code produces the following output:
// Decomposed expression: num => num LessThan 5
// using System.Linq.Expressions;
// Create an expression tree.
Expression<Func<int, bool>> exprTree = num => num <5;
// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
param.Name, left.Name, operation.NodeType, right.Value);
// This code produces the following output:
// Decomposed expression: num => num LessThan 5
這里表達(dá)式的入口參數(shù)是一個(gè)int型的變量,表達(dá)式左邊就是這個(gè)參數(shù)本身,右邊是一個(gè)常量,因此用
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
來解析即可,但如果入口是一個(gè)實(shí)體呢,這種情況很常見,應(yīng)該怎么解析呢,通過向高人請教,最后用編譯表達(dá)式樹終于解決了這個(gè)問題:
//實(shí)體類
public class T
{
public int ID { get; set; }
public string Name { get; set; }
}
//解析表達(dá)式樹類
public class Test
{
public void ExpressionTest(Expression<Func<T, bool>> exprTree)
{
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
MemberExpression left = (MemberExpression)operation.Left;
MemberExpression right = (MemberExpression)operation.Right;
var result=Expression.Lambda(right).Compile().DynamicInvoke();
Console.WriteLine("Decomposed expression:{0}=>{1} {2} {3}",
param.Name,left.Member.Name,operation.NodeType,result.ToString());
}
}
//調(diào)用
public class Program
{
static void Main(string[] args)
{
Test test = new Test();
T t = new T() { ID = 1, Name = "abc" };
test.ExpressionTest(o => o.ID == t.ID);
test.ExpressionTest(o => o.Name == t.Name);
Console.Read();
}
}
public class T
{
public int ID { get; set; }
public string Name { get; set; }
}
//解析表達(dá)式樹類
public class Test
{
public void ExpressionTest(Expression<Func<T, bool>> exprTree)
{
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
MemberExpression left = (MemberExpression)operation.Left;
MemberExpression right = (MemberExpression)operation.Right;
var result=Expression.Lambda(right).Compile().DynamicInvoke();
Console.WriteLine("Decomposed expression:{0}=>{1} {2} {3}",
param.Name,left.Member.Name,operation.NodeType,result.ToString());
}
}
//調(diào)用
public class Program
{
static void Main(string[] args)
{
Test test = new Test();
T t = new T() { ID = 1, Name = "abc" };
test.ExpressionTest(o => o.ID == t.ID);
test.ExpressionTest(o => o.Name == t.Name);
Console.Read();
}
}
運(yùn)行結(jié)果如下:
園子中有位朋友提供了另外一種方法(http://home.cnblogs.com/q/22976/),不過那個(gè)方法有一定缺陷,要依賴于實(shí)體類型,如果像上面代碼中那樣把表達(dá)式做為一個(gè)參數(shù)就無能為力了。

作者:Artwl
本文首發(fā)博客園,版權(quán)歸作者跟博客園共有。轉(zhuǎn)載必須保留本段聲明,并在頁面顯著位置給出本文鏈接,否則保留追究法律責(zé)任的權(quán)利。
浙公網(wǎng)安備 33010602011771號