ユーザー入力からいくつかの解析を行っています。ここでは、特定のタイプである必要がある引数の配列を解析する必要があります。
解析の時点では、各引数がどのタイプであるべきかわかりませんが、任意のタイプに評価できます。そこで、それらをオブジェクトの配列に一時的に格納することにしました。しかし、私がこのようなことをしようとすると:
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)));
これまでのところ、配列内のさまざまなタイプのオブジェクトのリストを取得しました。
しかし、最終的に目的のタイプを取得したら、すべての値を上の配列からそのタイプに変換しようとします (そのタイプは通常 int であるとしましょう)。
Expression.Convert(expr, typeof(int)); or
Expression.Unbox(expr, typeof(int));
これは、expr が実際には文字列「aaaaa」である場合の両方のコマンドのデバッグ ビューです。
(System.Int32)((System.Object)"aaaaa")
さて、ここに私の問題があります。これは例外をスローしません。しかし、expression が最終的にコンパイルされるときはそうなります。つまり、string は int ではありません。
たぶん、これは本当に例外をスローするべきではありません。わかりません。しかし、これは私にはうまくいきません。
これに対する治療法はありますか?
編集:コードは次のようになります。
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);
}