Часто отладка похожа на журналистику ... В журналистике есть пять Вт : , кто , , что , , где , когда , почему (плюс как ) .. и в программировании это похоже. кто выдает исключение (то есть что )? Давайте сделаем код более простым для отладки:
static Expression ParseOrConvert(ParameterExpression strArray, ConstantExpression index, ParameterInfo paramInfo)
{
Type paramType = paramInfo.ParameterType;
Expression paramValue = Expression.ArrayIndex(strArray, index);
MethodInfo parseMethod = paramType.GetMethod("Parse", new[] { typeof(string) });
var isPrimitive = Expression.Constant(paramType.IsPrimitive);
var call = Expression.Call(parseMethod, paramValue);
var convert = Expression.Convert(paramValue, paramType);
var paramValue2 = Expression.Condition(
isPrimitive,
call,
convert
);
return paramValue2;
}
А потом назовите это как:
public static void MyMethod(int par1)
{
}
, а затем
ParameterExpression strArray = Expression.Parameter(typeof(string[]));
// paramType int
var paramInfo = typeof(Program).GetMethod("MyMethod").GetParameters()[0];
var result = ParseOrConvert(strArray, Expression.Constant(0), paramInfo);
Теперь ... Кто выбрасывает исключение? Expression.Convert(paramValue, paramType)
выдает исключение ... А почему ? Потому что вы пытаетесь сделать:
string paramValue = ...;
convert = (int)paramValue;
Это, безусловно, незаконно! Даже «мертвый» код (код, который не может быть достигнут) должен быть «компилируемым» в .NET (на языке IL). Таким образом, ваша ошибка пытается ввести какой-то недопустимый мертвый код в ваше выражение, которое будет выглядеть так:
string paramValue = ...;
isPrimitive = true ? int.Parse(paramValue) : (int)paramValue;
Это не скомпилируется в C # и, вероятно, даже не может быть написано в коде IL. И классы Expression бросают на него.