Я делаю какой-то анализ пользовательского ввода, и здесь мне нужно проанализировать массив аргументов, которые должны быть определенного типа.
В момент разбора я не знаю, какой тип должен быть у каждого аргумента, но он может быть оценен для любого типа.Итак, я решил временно хранить их в массиве объектов.Но когда я пытаюсь сделать что-то вроде этого:
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")
Теперь моя проблема: это НЕ БУДЕТ генерировать исключение.Но это произойдет, когда выражение будет окончательно скомпилировано.Я имею в виду, строка не является 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);
}