c# property get,set avec différents types
J'ai une enum et une propriété.
public enum Type
{
Hourly = 1,
Salary = 2,
None = 3
};
public string EmployeeType
{
get
{
string type;
switch (employeeType)
{
case Type.Hourly:
type = "Hourly Employee";
break;
case Type.Salary:
type = "Salary Employee";
break;
default:
type = "None";
break;
}
return type;
}
//**EDIT:**
//Now I am trying to parse the string as enum Type.
//But Constructor still waits a string to set EmployeeType.
set
{
employeeType = (Type)Enum.Parse(typeof(Type), value);
}
}
C'est ma classe:
public class Employee
{
private Type employeeType;
}
Et je veux créer un tel constructeur:
Employee(Employee.Type type)
{
EmployeeType = type;
}
EDIT:
Impossible de convertir implicitement le type de la Paie.De l'employé.'Type 'string'
Comment dois-je écrire l'accesseur set de la propriété?
Mise à JOUR:
Je voulais l'accesseur get à la chaîne de retour et accesseur set de prendre paramètre de type de l'Employé.Type. J'ai appris qu'il est impossible de le faire dans une propriété selon le C# spec. Je dois écrire une getter et setter.
OriginalL'auteur Timuçin | 2011-04-15
Vous devez vous connecter pour publier un commentaire.
Utilisation DescriptionAttribute à la place.
Alors vous avez simplement une
de la propriété. Et si quelqu'un voulait l'écrire, ils pourraient obtenir la description. Je voudrais aussi appeler
Type
au lieu deEmployeeType
, parce que l'appelmyEmployee.EmployeeType
sons redondants. Votre autre option pourrait être de dérouler la propriété et disposez de deux méthodesPas aussi élégant comme une propriété, mais il a rapidement fait le travail. Rappelez-vous aussi que les propriétés de l'IL sont tout simplement des méthodes.
Je le recommande contre elle parce que vous avez à faire une sorte de traitement de chaîne à un enum. Vous ne savez pas si la chaîne de caractères sera à venir avec le bon format ou il sera "le Salaire de l'Employé". Aussi ce qui se passe si la chaîne à venir n'est pas une partie de l'enum? À l'aide de l'Enum est plus proche d'un typage statique contrat pour l'utilisateur à utiliser.
vous êtes de droite. Votre suggestion est une meilleure option. Mais supposons que je suis en train de l'analyser comme une des réponses ci-dessous. Pourquoi est-il toujours donner "Impossible de convertir implicitement le type 'Employé.'Type 'string'" erreur dans le constructeur?
Je pense que je doit le rendre clair: je veux l'accesseur get à la chaîne de retour. Je veux l'accesseur set de prendre paramètre de type de l'Employé.Type. N'est-il pas possible?
qui est impossible d'après C# Spec.
OriginalL'auteur Yuriy Faktorovich
Comme ceci:
Sa donne cette erreur: La non-méthode générique " du Système.Enum.Parse(System.Type, string, bool) " ne peut pas être utilisé avec des arguments de type
Désolé, il n'est pas générique, c'était une faute de frappe
Oh, je ne savais pas qu'il ne permettait pas un générique. L'homme, ce serait génial. Note pour Microsoft: Faire une extension générique pour les Analyser.
OriginalL'auteur Iain Ward
Je vous recommande de ne pas utiliser le type de mot, et vous devez analyser les enum:
Edit:
Tout d'abord, je ne peux pas réitérer assez de ne pas utiliser le Type de mot pour l'enum OU de la chaîne pour le retour de la propriété. Deuxièmement, l'utilisation des énumérations ici avec interrupteur, cela peut causer des problèmes, mais la valeur par défaut peut caution vous.
Je soupçonne que le problème que vous rencontrez avec la conversion, c'est que vous êtes en utilisant une tâche qui n'est pas une chaîne comme:
C'est une défaillance de cas, parce que someType est un type et EmployeeType (valeur) est une chaîne de caractères. Pour y remédier, vous devez l'affecter avec:
Tous de ce genre de résume assez ridicule, car il peut être accompli avec quelque chose d'aussi simple que:
Sa donne cette erreur sur le constructeur:Impossible de convertir implicitement le type 'Employé.'Type 'string'
alors votre définition de
employeeType
ne doit pas être fixé à l'Employé.Type. Quelque part vous avez un cliquetis type. Pouvez-vous fournir un montage qui comprend où vous déclarez la variableemployeeType
?Non, son Employé.Type et toujours cette erreur.
J'ai remarqué un couple de d'autres choses, donc je vais poster une modification.
OriginalL'auteur Joel Etherton
Idéalement, vous devriez toujours avoir un membre privé vous pouvez définir/obtenir que la propriété peut vous attacher. À partir de là, vous pouvez faire une autre méthode pour obtenir le "Human Readable/mise en forme" de la version. par exemple,
Alors vous avez une méthode pour revenir à la version mise en forme
ou c'est comment j'allais le faire. Sinon, un enum ne fait pas de sens et il vous suffit de travailler avec une chaîne et valider l'entrée/la sortie de la chute à l'intérieur de pré-sélectionné des valeurs valides.
MODIFIER je recommande ce juste parce que une chaîne de caractères en entrée et en essayant de les aligner avec le nom d'un enum (comme d'autres l'ont suggéré) apparaît imparfait pour moi. Surtout avec la transition de la "toutes les heures" à "Horaire de l'Employé".
(obj).EmployeeType = "Hourly Employee"
ne fonctionne pas avec l'aide deEnum.Parse
car il n'est pas valide enum correspondant à l'entrée.EDITv2 en fait, j'aime @Youri est utilisation de la
DescriptionAttribute
mieux. Garder de type structuré, mais de le rendre lisible lors de l'impression.Le point d'un enum pour atténuer l'aide de "dur à cordes" pour les valeurs. Vous pouvez analyser les
value
et de regarder pour un ensemble de pré-défini des valeurs et de l'ensemble de votreemployeeType
variable, mais cela semble alambiqué contre seulement référencement sur les valeurs de l'enum.OriginalL'auteur Brad Christie