嗯…我想您必须解析树,检查每个树的节点类型和成员。我举一个例子…
using System;using System.Linq.expressions;class Test { public string Foo { get; set; } public string Bar { get; set; } static void Main() { bool test1 = FuncTest<Test>.FuncEqual(x => x.Bar, y => y.Bar), test2 = FuncTest<Test>.FuncEqual(x => x.Foo, y => y.Bar); }}// this only exists to make it easier to call, i.e. so that I can use FuncTest<T> with// generic-type-inference; if you use the doubly-generic method, you need to specify// both arguments, which is a pain...static class FuncTest<TSource>{ public static bool FuncEqual<TValue>( expression<Func<TSource, TValue>> x, expression<Func<TSource, TValue>> y) { return FuncTest.FuncEqual<TSource, TValue>(x, y); }}static class FuncTest { public static bool FuncEqual<TSource, TValue>( expression<Func<TSource,TValue>> x, expression<Func<TSource,TValue>> y) { return expressionEqual(x, y); } private static bool expressionEqual(expression x, expression y) { // deal with the simple cases first... if (ReferenceEquals(x, y)) return true; if (x == null || y == null) return false; if ( x.NodeType != y.NodeType || x.Type != y.Type ) return false; switch (x.NodeType) { case expressionType.Lambda: return expressionEqual(((Lambdaexpression)x).Body, ((Lambdaexpression)y).Body); case expressionType.MemberAccess: Memberexpression mex = (Memberexpression)x, mey = (Memberexpression)y; return mex.Member == mey.Member; // should really test down-stream expression default: throw new NotImplementedException(x.NodeType.ToString()); } }}


