2016-05-04 35 views
0

列挙型を使用して、equalsとCallExpressionを作成します。LINQの式は - >私は<code>CallExpression</code>ようを構築しようとしている

f.Equals(s); 

ftenum STypeをしています。

ので、

var equalsMethod = typeof(SType).GetMethod("Equals", new[] { typeof(SType) }); 
ConstantExpression constantExpression = Expression.Constant(value, typeof(SType)); 
var newBody = Expression.Call(expr.Body, equalsMethod, constantExpression); 
return Expression.Lambda<Func<TEntity, bool>>(newBody, expr.Parameters); 

私は知らないが、equalsMethodBoolean Equals(System.Object)の代わりBoolean Equals(SType)です。私はCallExpressionネット私に指示を構築したいとき

だから、私はこの方法Boolean Equals(System.Object)の種類System.Objectのパラメータの種類STypeの発現を使用することはできませんよ。

どういうところが間違っていますか?

答えて

2

あなたが本当にやっているf.Equals(s)呼び出す:

f.Equals((object)s) 

を... EnumValueTypeEqualsに過負荷をかけないためです。だから、基本的に、あなたはそこでの変換を必要とする - あなたはあまりにもあなたが呼んでいるEquals方法、に関する明確にすることができます:確かにあなたはおそらくだけで、別のステップを避けることができ

var equalsMethod = typeof(object).GetMethod("Equals", new[] { typeof(object) }); 
var constant = Expression.Constant(value, typeof(SType)); 
var boxed = Expression.Convert(constant, typeof(object)); 
var newBody = Expression.Call(expr.Body, equalsMethod, boxed); 
return Expression.Lambda<Func<TEntity, bool>>(newBody, expr.Parameters); 

var equalsMethod = typeof(object).GetMethod("Equals", new[] { typeof(object) }); 
// Let this do the boxing for you... 
var constant = Expression.Constant(value, typeof(object)); 
var newBody = Expression.Call(expr.Body, equalsMethod, constant); 
return Expression.Lambda<Func<TEntity, bool>>(newBody, expr.Parameters); 

私はそれを試していないが、うまくいくとは思う。

2

Jonは既にあなたのコードに何が問題なのかを説明しました。あなたが特定のExpression.Equal方法はただそのためにそこにいる間MethodCallExpressionEqualsにメソッドを作成するなぜわざわざしかし、私は(まあ、等価比較を行うため、正確には)思ったんだけど:

return Expression.Lambda<Func<TEntity, bool>>(
    Expression.Equal(expr.Body, Expression.Constant(value)), 
    expr.Parameters); 
+1

注 'Expression.Equalこと'は' operator == 'の呼び出しであり、' Equals'の呼び出しではありません。式がコンパイルされている場合、同等であることは保証されませんが、強く推奨されます。式がEntityFramework/LinqToSqlクエリで使用される場合、それらは同じように変換されます。 – Johnbot

関連する問題

 関連する問題