Pergunta

Ao construir um ArgumentException, um par das sobrecargas ter uma cadeia que é o nome do parâmetro do argumento inválido. Eu acho que seria bom para não ter que se lembrar de atualizar esta param ctor sempre que eu mudar param name do método. Existe uma maneira simples de fazer isso usando a reflexão?

Update: graças aos 2 entrevistados até agora. Você ambos resposta à pergunta bem, mas a solução ainda me deixa com uma dor de cabeça de manutenção. (Ok, a pequena dor de cabeça, mas ainda assim ...) Para explicar, se eu fosse para reordenar os parâmetros mais tarde - ou remover um param antes - eu tinha tem que se lembrar de alterar o código de exceção de construção de novo. Existe uma maneira que eu posso usar algo ao longo das linhas de

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

Para ter certeza que eu estou lidando com o parâmetro relevante? Dessa forma, o compilador iria intervir para impedir que me mal construindo a exceção.

Dito isso, eu estou começando a suspeitar que a parte "simples" da pergunta original não é que próximo. Talvez eu deva colocar-se com o uso de strings literais. :)

Foi útil?

Solução

A reflexão não é apropriado para isso.

Você vai ter que aturar lembrando-se de obtê-lo direito.

Felizmente FxCop (ou equipe de análise de código do sistema) irá ajudá-lo, apontando eventuais descasamentos.

Outras dicas

Você pode usar uma árvore de expressão para isso, que você irá obter o que quer na cara de alguma sintaxe estranha. Por exemplo.

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

Onde NameOfVariable é definido como:

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

Isto também tem a chance de deixar de funcionar em tempo de execução se você passar outra coisa senão um UnaryExpression para NameOfVariable.

Eu não ficaria surpreso se este código também provoca FxCop para reclamar, e como Joe menciona usando FxCop é provavelmente a melhor maneira de fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top