Как программно определить имя параметра при создании ArgumentException?

StackOverflow https://stackoverflow.com/questions/94263

Вопрос

При создании ArgumentException пара перегрузок принимает строку, которая является именем параметра недопустимого аргумента.Я полагаю, было бы неплохо не помнить об обновлении этого параметра ctor всякий раз, когда я меняю имя параметра метода.Есть ли простой способ сделать это с помощью отражения?

Обновить: спасибо уже двум респондентам.Вы оба хорошо ответили на вопрос, но решение по-прежнему вызывает у меня головную боль при обслуживании.(Хорошо, a крошечный болит голова, но все же...) Чтобы объяснить, если бы я хотел изменить порядок параметры позже - или удалите более ранний параметр - мне нужно было бы не забыть снова изменить свой код построения исключений.Есть ли способ, которым я могу использовать что-то вроде

Object.ReferenceEquals(myParam, <insert code here>)

чтобы быть уверенным, что я имею дело с соответствующим параметром?Таким образом, компилятор вмешался бы, чтобы помешать мне неправильно сконструировать исключение.

Тем не менее, я начинаю подозревать, что "простая" часть первоначального вопроса не так уж и ожидаема.Может быть, мне стоит просто смириться с использованием строковых литералов.:)

Это было полезно?

Решение

Рефлексия для этого не подходит.

Вам придется смириться с тем, что вы помните, чтобы сделать это правильно.

К счастью, FxCop (или Team System Code Analysis) поможет вам, указав на любые несоответствия.

Другие советы

Вы могли бы использовать для этого дерево выражений, которое даст вам то, что вы хотите, ценой некоторого странного синтаксиса.Например.

public void Resize(int newSize)
{
  if (newSize < 1)
  {
    throw new ArgumentException("Blah", NameOfVariable(() => newSize));
  }
  // ... whatever ...
}

Где NameOfVariable определяется как:

public static string NameOfVariable(Expression<Func<object>> expressionTree)
{
   var expression = (UnaryExpression)expressionTree.Body;
   var memberExpression = (MemberExpression)expression.Operand;
   return memberExpression.Member.Name;
}

Это также может привести к сбою во время выполнения, если вы передадите что-либо, кроме UnaryExpression, в NameOfVariable .

Я не удивлюсь, если этот код также вызовет жалобы FxCop, и поскольку Джо упоминает, что использование FxCop, вероятно, является лучшим способом сделать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top