2009-04-14 10 views
8

Cela peut être un peu un anti-pattern, mais il est possible pour une propriété sur une classe C# d'accepter plusieurs valeurs? Par exemple, disons que j'ai une propriété int interne et que je veux toujours qu'elle renvoie un int, mais j'aimerais pouvoir la définir en assignant un nombre décimal, un nombre entier ou un autre type de données. Donc, ma question est de savoir s'il est possible pour les propriétés d'accepter plusieurs valeurs?Une propriété C# peut-elle accepter plusieurs valeurs?

Répondre

10

Je pense que vous voulez dire à se poser: Comment implicit et explicit travail casting pour int et decimal?

Vous posez des questions sur le moulage implicite qui couvre automatiquement un objet à un autre type défini. Vous ne serez pas en mesure de le faire pour un int et decimal parce qu'ils sont déjà définis dans le cadre et vous ne pouvez pas réduire la portée du decimal en le transformant en int. Mais si vous l'utilisiez comme exemple pour des objets réels que vous avez créés, vous pouvez utiliser le lien implicit ci-dessus, pour en savoir plus sur le fonctionnement et comment l'implémenter.

Mais vous pouvez toujours utiliser la méthode convert pour les convertir au bon type;

public int MyProperty { get; set; } 
... 
obj.MyProperty = Convert.ToInt32(32.0M); 
obj.MyProperty = Convert.ToInt32(40.222D); 
obj.MyProperty = Convert.ToInt32("42"); 
+0

J'utilisais des ints et des décimales plus à titre d'exemple mais c'est lié. Essentiellement, je veux juste pouvoir assigner plusieurs types différents à une seule propriété et laisser la propriété déterminer ce qu'il faut retourner. Comme vous le mentionnez, le casting implicite permettra cela. – lomaxx

+0

La seule autre chose que j'ajouterai est que si le casting implicite résoudra le problème, il ne semble pas en limiter suffisamment la portée. Cela fonctionnera bien pour ce que j'essaie de faire, mais je peux voir des problèmes potentiels avec im (ex) casting explicite si j'ai besoin de règles spécifiques pour chaque distribution. – lomaxx

+0

Avec tout ce que je dis, je pense toujours que ce que j'essaie de faire est un anti-pattern et que je serais probablement mieux servi soit dans un langage dynamique où je peux assigner tout ce que je veux, soit repenser ce que je fais pour éviter le problème en premier lieu. – lomaxx

-1

Les propriétés sont supposées ressembler à des champs publics. Créez des méthodes setter, ou faites le cast/conversion dans les instructions d'assignation par opposition au set-setter.

0

N ° Une propriété a une valeur unique. Vous pouvez lui affecter n'importe quoi qui pourrait être assigné à une variable du même type.

+0

Cela n'est pas vrai, vous pouvez l'affecter à n'importe quel objet pouvant être explicitement converti en. –

+0

@Nick Berardi: Ce n'est pas exact. Une fois que vous l'avez transformé en un type différent, vous affectez le type différent! –

+0

@John: D'accord, je ne sais pas ce que Nick fume. – Samuel

1

Il semble que vous deviez connaître le type au moment de l'exécution. Vous pourriez avoir la propriété accepter un objet, déterminer le type et prendre votre action. Vous devriez prévoir des exceptions pour des choses auxquelles vous ne vous attendez pas, bien sûr. Comme vous dites, probablement pas le meilleur, mais possible. :)

2

Edit: Cette méthode ne peut pas être utilisé car l'op est spécifiquement lié aux propriétés.

Je ne crois pas que ce soit possible avec la robustesse que vous décrivez. Dans ce cas, il est préférable d'utiliser une méthode surchargée (polymorphisme).

C'est ce qu'on appelle généralement un setter (ou un mutateur) et vous pouvez surcharger la méthode pour accepter plusieurs types de paramètres différents. Chacun fonctionnera différemment si vous le souhaitez. La façon dont je les ai mis en place n'est peut-être pas syntaxiquement correcte, mais c'est l'idée générale que vous cherchez, je crois.

public class MyClass { 
    private Int32 mySomeValue; 
    public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); } 
    public void setSomeValue(Int32 value) { this.mySomeValue = value; } 
} 
Questions connexes