私はユーザー入力からいくつかの解析を行います。ここでは、特定の型の引数の配列を解析する必要があります。LINQ式異なるオブジェクト型を持つ配列を作成する
構文解析の時点では、それぞれの引数をどのタイプにするか分かりませんが、どのタイプにも評価できます。だから、私は一時的にオブジェクトの配列に格納することにしました。私はこのような何かしようとすると、しかし:
NewArrayExpression returnValue = Expression.NewArrayInit(typeof(object), expressionList);
を私は次の例外を取得:タイプの表現「を可能System.Int32」タイプの配列を初期化するために使用することはできません「のSystem.Object」。
暗黙のボクシングが起こっていないので、つまり、私は仮定しています。だから私はそれ自身ボックス:
expressionList.Add(Expression.TypeAs(expression, typeof(object))); or
expressionList.Add(Expression.Convert(expression, typeof(object)));
これまでのところとても良い:私は配列内のさまざまな種類のオブジェクトのリストを得た。これは
Expression.Convert(expr, typeof(int)); or
Expression.Unbox(expr, typeof(int));
:
しかし、私は最終的に所望の種類を得るとき、私はそのタイプに上位配列の値のすべてを変換してみてください、私はそれを変換(その型がint usualyていると言うことができます) exprがactualy文字列「AAAAA」であるとき、両方のコマンドのデバッグビューは:
(System.Int32)((System.Object)"aaaaa")
さて、ここで私の問題がある:これは例外をスローしません。しかし、それは最終的に表現がコンパイルされる時になります。つまり、文字列はintではありません。
これは本当に例外を投げるべきではないかもしれませんが、わかりません。しかし、これは私のためには機能しません。
これに対して治療法はありますか?
EDIT:のコードは次のようになります。
static Expression InArguments(ParameterExpression pe, string[] arguments)
{
List<Expression> listaExpr = new List<Expression>();
foreach (string s in arguments)
{
Expression expression = Complete(pe, s); // evaluate argument
// listaExpr.Add(Expression.Convert(expression, typeof(object)));
}
return Expression.NewArrayInit(typeof(object), listaExpr);
}
は、なぜあなたは、配列内のオブジェクトを格納する必要があると思いますか?式全体のサンプルを表示できますか?特に配列の使い方は? – svick
さて、私はSQL IN演算子を模倣しようとしています。ユーザーは のようなコードを入力する必要があります。Item.Code IN [1,2,3]またはPartner.Name IN ["aa"、 "bb"] Codeは動的にintに評価され、Nameはstringに評価されます。 また、これは許可されています:Item.Code IN [1,2、Partner.GetTopItem()] –
したがって、単純な型(int、string、decimal)になる可能性のあるIN演算子のすべての引数を評価する必要があります。私のモデルからのどんなタイプでも、またはその事柄についてはそれらのコレクションをもたらす可能性があります。その後、私はそれらを左のオペランドの型にキャストします。私は知らない、多分私はものをovercomplicatingしている –