2017-09-21 3 views
-1

J'ai une classe comme celle-ci avec quelques attributs personnalisés. Je ne suis pas sûr si je dois réellement mettre en œuvre ces derniers.Itération à travers des propriétés avec des attributs personnalisés dans une classe

[AttributeUsage(AttributeTargets.Field)] 
    private class IsValue : Attribute { } 
    [AttributeUsage(AttributeTargets.Field)] 
    private class IsRep : Attribute { } 
    [AttributeUsage(AttributeTargets.Class)] 
    private class IsConstant : Attribute { } 
    public static class Constants 
    { 
     [IsConstant] 
     public static class EulerGamma 
     { 
      [IsValue] 
      public const double Value = 0.5772156649015; 
      [IsRep] 
      public const string Str = "γ"; 
     } 
     [IsConstant] 
     public static class EulerNumber 
     { 
      [IsValue] 
      public const double Value = 2.718281828459; 
      [IsRep] 
      public const string Str = "e"; 
     } 
     [IsConstant] 
     public static class Pi 
     { 
      [IsValue] 
      public const double Value = 3.1415926535898; 
      [IsRep] 
      public const string Str = "π"; 
     } 
     [IsConstant] 
     public static class GoldenRatio 
     { 
      [IsValue] 
      public const double Value = 1.6180339887499; 
      [IsRep] 
      public const string Str = "φ"; 
     } 
    } 

Disons que cela est dans une classe « MyMathClass », où je voudrais mettre en œuvre une méthode comme ceci: string ValueOrString(double x) Cette méthode retournerait représentation de chaîne de la constante si le nombre passé est égal au constant, sinon il retournerait le numéro d'origine. Donc, si je passais exactement 3.1415926535898 cette méthode me donnerait la chaîne "π". Si est passé par exemple 2.5315621321 cela me retournera "2.5315621321" (chaîne de caractères). Pourriez-vous m'aider s'il vous plaît?

Répondre

1

Je voudrais créer une classe qui utilise un dictionnaire:

public static class Constants 
{ 
    static Dictionary<double, string> constantNames; 

    static Constants() 
    { 
     Constants.constantNames = new Dictionary<double, string>(); 

     Constants.constantNames.Add(3.1415926535898, "π"); 
     Constants.constantNames.Add(2.718281828459, "e"); 
    } 

    public static string ValueOrString(double value) 
    { 
     if (constantNames.ContainsKey(value)) 
     { 
      return constantNames[value]; 
     } 
     else 
     { 
      return value.ToString(); 
     } 
    } 
} 

Lorsque la fonction string ValueOrString(double value) est appelée, vous pouvez vérifier si la valeur fournie existe dans le dictionnaire. S'il existe, vous récupérez le nom de la constante. Sinon, vous renvoyez la valeur sous la forme d'une chaîne.

+0

Merci pour cette idée :-D Mes constructions étaient tellement bêtes, en fait je viens d'implémenter simplement la liste statique privée de ces noms de constante dans la classe "MyMath" :) –