2010-11-04 4 views
1

J'ai donc rencontré un cas où j'ai une classe qui peut stocker une chaîne ou une valeur numérique, et je veux qu'une seule propriété renvoie l'une ou l'autre (ce serait un échec pour que les deux soient définis) . J'utilise une classe générique personnalisée pour gérer les valeurs numériques (donc je peux utiliser signed, unsigned, et nullables), et je vais stocker la chaîne dans une variable séparée.Est-il possible pour une propriété publique de renvoyer une chaîne OU une entrée numérique en utilisant 'Object'?

En théorie, si une surcharge pouvait se faire en fonction du type de retour, je pourrais le faire assez facilement. Mais .NET interdit actuellement cela. Je me demande donc s'il existe une autre astuce vraiment hors de portée (en dehors de la génération MSIL via Reflection.Emit) qui pourrait accomplir la même chose. Je suis ouvert aux idées via les délégués, le déréférencement des pointeurs, les génériques, les rites mystiques, etc. Je m'intéresse également à toutes les pensées ou avantages/inconvénients de telles possibilités comme outil d'apprentissage. Si l'utilisation d'un objet standard est la seule façon de réaliser ce que je veux, alors ça me convient. Mais il est difficile de trouver le bon ensemble de mots-clés pour traquer ce genre de fonctionnalités sur Google, alors j'ai pensé que je demanderais ici avant de passer à autre chose sur le projet.

Répondre

1

Je ne vois pas comment utiliser autre chose que Object fonctionnerait, pour une propriété simple. Imaginez que vous êtes l'appelant - que voulez-vous que le type déclaré de la propriété soit? À quel type de valeur essaieriez-vous d'attribuer l'expression?

Si vous avez vraiment avez pour avoir une seule propriété qui peut retourner différents types différents, Object sonne comme le chemin à parcourir.

+0

Oui, c'est ce que je pense être ma seule option saine. Je me suis rendu compte qu'avec tout le fancissement que .NET a, qu'il ne serait pas du domaine des possibilités pour le compilateur de travailler avec de telles propriétés et être capable de savoir quelle propriété surchargée spécifique a été appelée. J'apprends toujours les différents noms/mots-clés de fonctionnalités .NET spécifiques, donc je m'assure que je ne manque pas quelque chose. – Kumba

0

Vous pouvez avoir la propriété publique sous forme de chaîne et également renvoyer le nombre après la conversion en chaîne.

public string YourProperty 
{ 
    get { 
      if(somecondition) 
       return "some string"; 
      else if(someothercondition) 
       return 1234.ToString(); 
     } 
} 

Lors de l'accès à votre propriété, vous pouvez utiliser Convert.ToInt32(). Exemple:

public void YourMethod() 
{ 
    int a; 
    string str; 
    bool isNumber; 
    try 
    { 
     a = Convert.ToInt32(obj.YourProperty); 
     isNumber = true; 
    } 
    catch(FormatException e) 
    { 
     str = obj.YourProperty; 
     isNumber = false; 
    } 
} 

Bien que ce n'est pas une bonne programmation de façon, mais vous acheive votre objectif d'utiliser une seule propriété à la fois la chaîne et le numéro.

+0

Oui, mais c'est pour un getter seulement. Le réglage exigerait que je vérifie les limites du nombre dans la chaîne pour m'assurer qu'il entrerait dans le type de données. Techniquement, je suis dans le même bateau avec un objet. Il serait simplement plus propre si les propriétés pouvaient prendre en charge plusieurs types de retour sous une forme ou une autre, ou autoriser une surcharge en fonction du type de retour. Ou même autoriser des propriétés génériques, ce qui devrait créer des signatures uniques. – Kumba

Questions connexes