Domanda

Quando la costruzione di un'eccezione ArgumentException, un paio di overload prendere una stringa che rappresenta l'argomento non valido il nome del parametro.Io penso che sarebbe bello non doversi ricordare di aggiornare questo ctor param ogni volta che cambia il metodo param name.C'è un modo semplice per eseguire questa operazione utilizzando la riflessione?

Aggiornamento: grazie per la 2 intervistati finora.Si sia per rispondere alla domanda, ma la soluzione mi lascia ancora un intervento di manutenzione mal di testa.(Va bene, un piccolo mal di testa, ma comunque...), Per spiegare, se dovessi riordinare params dopo -- o rimuovere un precedente param -- devo ricordare di cambiare la mia eccezione, il codice di creazione di nuovo.C'è un modo posso usare qualcosa lungo le linee di

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

per essere sicuro ho a che fare con il parametro pertinente?In questo modo, il compilatore sarebbe intervenire per evitare che mi copri la costruzione di eccezione.

Detto questo, sto iniziando a sospettare che il "semplice" parte della domanda originale non imminente.Forse dovrei solo mettere in su con l'utilizzo di stringhe letterali.:)

È stato utile?

Soluzione

La riflessione non è appropriato per questo.

Dovrete mettere in su con il ricordo di farlo bene.

Fortunatamente FxCop (o Team System per l'Analisi del Codice) ci aiuterà e segnalando eventuali incongruenze.

Altri suggerimenti

Si potrebbe usare un'espressione di questa struttura, che ti desidera si desidera a costosi di qualche strana sintassi.E. g.

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

Dove NameOfVariable è definito come:

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

Questo ha anche la possibilità di danneggiamento in fase di runtime se si passa a qualcosa di diverso da un UnaryExpression per NameOfVariable.

Non sarei sorpreso se questo codice è causa anche di FxCop a lamentarsi, e come Joe accenna all'uso di FxCop è probabilmente il modo migliore di fare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top