Как программно определить имя параметра при построении ArgumentException? - PullRequest
3 голосов
/ 18 сентября 2008

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 22 декабря 2008

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

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;
}

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

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

2 голосов
/ 18 сентября 2008

Отражение не подходит для этого.

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

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

...