我不做表達樹的工作足以讓這個工作......
基本上我想要創建的是m.MyProperty == 1
,用於採用Func<T, bool>
。
我已經有了一個MemberExpression
。我嘗試了各種各樣的東西,但我只是不斷得到不同的錯誤。
我目前有類似的東西(這不起作用):
object const = 1;
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, Expression.Parameter( typeof( T ) ).Compile();
這給了我一個例外:
System.InvalidOperationException:從範圍''引用的'MyType'類型的變量'm',但它未定義
我已經嘗試過重新處理這個的幾個不同部分,但還沒有提出任何有效的方法。
const
是一個可以是任何類型的對象,但應該與MemberExpression
的類型匹配。
解:
object c = 1;
var parameterExpression = (ParameterExpression)memberExpression.Expression;
var equalExpression = Expression.Equal(memberExpression, Expression.Constant(c));
var compiled = Expression.Lambda<Func<T, bool>>(equalExpression, parameterExpression).Compile();
這不起作用的原因是您在編譯lambda時使用“獨立”參數表達式。您應該在創建memberExpression
之前創建Expression.Parameter( typeof( T ))
,並在創建成員表達式和編譯lambda時使用相同的ParameterExpression
實例 :
var pe = Expression.Parameter( typeof( T )); // <<== Here
var memberExpression = Expression.PropertyOrField(pe /* Here */, "MyProperty");
var equalExpression = Expression.Equal( memberExpression, Expression.Constant( const ) );
var compiled = Expression.Lambda<Func<T, bool>>( equalExpression, pe ).Compile();
// ^^
// ||
// And here