2010-02-11 3 views
3

Je souhaite créer une classe d'erreur. Et il a des propriétés statiques. Par exemple: Message, InnerException, Stacktrace, Source. Mais je veux ajouter quelques propriétés dynamiques.Comment ajouter dynamiquement une propriété à une classe

Si l'exception est un FileNotFoundException, je souhaite ajouter la propriété FileName. Ou si c'est un SqlException, je veux ajouter la propriété LineNumber. Et je ne peux pas hériter de cette classe de Exception car, je renvoie cette classe à partir d'un service Web. Comment puis je faire ça?

Répondre

1

vous pouvez créer un type dynamiquement à l'aide de nouvelles fonctionnalités en C# comme des types anonymes

Je ne sais pas si vous essayez de faire quelque chose de similaire, mais peut atteindre l'exigence suivante

 public interface IError { } 

     public class ErrorTypeA : IError 
     { public string Name; } 

     public class ErrorTypeB : IError 
     { 
      public string Name; 
      public int line; 
     } 

     public void CreateErrorObject() 
     { 
      IError error; 
      if (FileNotFoundException) // put your check here 
      { 
       error = new ErrorTypeA 
        { 
         Name = "" 
        }; 
      } 
      elseif (InValidOpertionException) // put your check here 
      { 
       error = new ErrorTypeB 
       { 
        Name = "", 
        line = 1 
       }; 
      } 
     } 

Espoir cela aide

+0

Donc vous attrapez l'exception et l'envelopper? C'est une très mauvaise façon de traiter les exceptions (le code appelant devra toujours vérifier la valeur de retour et traiter l'exception). Cela rend le code consommateur plus compliqué qu'il ne devrait l'être. –

+0

Le point pour cette affiche n'est pas la meilleure pratique pour la gestion des exceptions! veuillez revoir la question –

0

On ne sait pas très bien ce que vous essayez d'atteindre. Reconsidérez votre conception en faveur des classes non statiques et utilisez l'héritage.

Et vous vous souvenez qu'il y a beaucoup de classes d'exceptions prêtes à l'emploi dans le .NET BCL, non?

2

C# est un langage typé statiquement. Cela signifie que vous ne pouvez généralement pas ajouter dynamiquement des propriétés aux classes lors de l'exécution sans une injection IL vraiment funky (que vous voulez absolument éviter). Dans votre cas, il semble que vous ayez besoin de mieux comprendre les exceptions. En général, nous émettons un type spécifique d'exception pour indiquer la cause d'un problème exceptionnel. Par exemple, si vous recherchez un fichier et qu'il n'est pas là, vous lanceriez une exception FileNotFoundException ou, en cas de problème spécifique à l'application, vous pourriez créer votre propre classe d'exception et lancer cette exception. Gardez à l'esprit que les exceptions doivent être exceptionnelles.

+0

avez-vous déjà entendu parler de types anonymes? –

+0

Ouais, j'en ai entendu parler - vous ne pouvez pas créer d'exceptions anonymes si –

2

Au lieu d'essayer de faire quelque chose C# ne gère pas actuellement très bien, je vous suggère de prendre une approche quelque peu différente. Pourquoi ne pas ajouter ces propriétés supplémentaires en tant que données dans un dictionnaire, pourquoi? Votre classe pourrait exposer une interface pour obtenir un certain nombre de «propriétés» (au sens général du terme), c'est-à-dire que les clés et votre code d'appel pourraient alors les examiner et les utiliser pour rechercher des valeurs si nécessaire.

0

Créez un nouveau type d'exception, dérivé de Exception. Jetez cette exception et définissez la propriété InnerException à l'exception qui a causé tout le chahut.

Vous pouvez vérifier le type de l'exception interne et afficher les données en conséquence.

Si possible, vous pouvez bien sûr aussi juste throw l'excpetion originale pour que l'appelant le manipule.

1

Mon point de vue serait d'utiliser un dictionnaire où vous pouvez stocker toutes les données supplémentaires.

public class Logging 
{ 
    private Dictionary<string, string> _ExtraInfo = new Dictionary<string, string>(); 

    public Dictionary<string, string> ExtraInfo { 
     get { return _ExtraInfo; } 
     set { _ExtraInfo = value; } 
    } 

} 

Pour utiliser:

Logging MyLogger = new Logging(); 
    MyLogger.ExtraInfo.Add("Filename", thefilename); 
    MyLogger.ExtraInfo.Add("ClientTime", now); 

Et ainsi de suite.

Questions connexes