Я пытаюсь получить значение параметров, переданных в выражение. Система будет использовать фабрику сообщений об ошибках, передавая значения, полученные из родительского / вызывающего метода. Если я жестко закодирую значение и передам его в выражение, массив Method.Arguments будет иметь фактическое значение, а метод ниже извлечет это значение. Если он передается из родительского метода, он в итоге получит то, что похоже на представление сигнатуры вызова метода
.Constant<AutoValidator.Impl.Validator+<>c__DisplayClass7_0>(AutoValidator.Impl.Validator+<>c__DisplayClass7_0).minLength
Я не уверен, что я каким-то образом неправильно передаю значения или пытаюсь получить их действительное значение неправильно.
//the expression will receive the value 123
_errorMessageFactory.Get<string>((val, exp) => exp.MinLength(text, 123, message), propName);
//we pass xx which has the value of 123, but the expression doesn't show this value
var xx = 123;
_errorMessageFactory.Get<string>((val, exp) => exp.MinLength(text, xx, message), propName);
public Tuple<string, List<object>> Get<TMember>(Expression<Func<TMember, IValidatorExpression, bool>> exp, string propName)
{
var methodCall = exp.Body as MethodCallExpression;
var methodSignature = methodCall.Method.ToString();
GetArgumentValue(methodCall.Arguments[1]);
}
private object GetArgumentValue(Expression methodExpression)
{
if (methodExpression.NodeType == ExpressionType.MemberAccess)
{
var memberExpression = (MemberExpression)methodExpression;
return GetArgumentValue(memberExpression.Expression);
}
else if (methodExpression.NodeType == ExpressionType.Constant)
{
var constExp = methodExpression as ConstantExpression;
return constExp?.Value;
}
throw new ArgumentOutOfRangeException("Unknown expression argument type");
}