2017-10-03 8 views
0

if else条件の外で式呼び出しを初期化したいとします。私は式の本体を生成するためにそれを使用する必要があります。なぜなら、私は2つの異なる型、つまりintとintのデータベースから来ているからです。私のコードは以下の通りです。 toStringオブジェクトをインスタンス化するときにエラーが発生します。System.Linq.ExpressionでExpression.Callオブジェクトを初期化する方法C#

var parameterExp = Expression.Parameter(typeof(T), "type"); 
var propertyExp = Expression.Property(parameterExp, propertyName); 
MethodInfo method = typeof(string).GetMethod(methodType, new[] { typeof(string) }); 
var searchValue = Expression.Constant(propertyValue.ToLower(), typeof(string)); 

var toString = new MethodCallExpression(); 

if (propertyName == nameof(CustomerListDto.Id)) 
{ 
    toString = Expression.Call(propertyExp, typeof(int).GetMethod("ToString", System.Type.EmptyTypes)); 
} 
else 
{ 
    toString = Expression.Call(propertyExp, typeof(int?).GetMethod("ToString", System.Type.EmptyTypes)); 
} 

var body = Expression.Call(toString, method, searchValue); 
return Expression.Lambda<Func<T, bool>>(body, parameterExp); 

ExpressionCallの初期化方法を正確にはわかりません。これは私が知りたいことです。現在、 "MethodCallExpressionには0引数を取るコンストラクタが含まれていません"というエラーが表示されています。私は多くを検索しましたが、解決策を見つけることができませんでした。

+1

"私はエラーが発生しています" - 何のエラー?それがコンパイル時エラーか例外かに関係なく、[mcve]に完全な結果を提供してください。 –

+0

intの値はありますか?ただヌルである? –

+0

@FilipCordas。それは価値を含んでいません。データ型はNullable Intです。 –

答えて

1

コンストラクタがprivateであるため、MethodCallExpressionを手動でインスタンス化することはできません。 Expression.Callの戻り値としてMethodCallExpressionのインスタンスを取得できます。あなたはおそらくそれを宣言したいだけです

MethodCallExpression toString; 

// Then assign it with Expression.Call(...); 

if (propertyName == nameof(CustomerListDto.Id)) 
{ 
    toString = Expression.Call(propertyExp, typeof(int).GetMethod("ToString", System.Type.EmptyTypes)); 
} 
else 
{ 
    toString = Expression.Call(propertyExp, typeof(int?).GetMethod("ToString", System.Type.EmptyTypes)); 
} 
関連する問題