2009-02-16 11 views
2

Est-il possible de stipuler que les clients d'une classe doivent spécifier une valeur pour un ensemble de propriétés dans une classe. Par exemple (voir le code ci-dessous), Puis-je stipuler que la propriété "EmploymentType" dans la classe Emploi doit être spécifiée lors de la compilation? Je sais que je peux utiliser un constructeur paramétré et autres. Je suis spécifiquement à la recherche de sortie d'un avertissement personnalisé ou d'une erreur lors de la compilation. Est-ce possible?stipulant qu'une propriété est requise dans une classe - compilation

public class Employment 
{ 
    public EmploymentType EmploymentType {get; set;} 
} 

public enum EmploymentType 
{ 
    FullTime = 1, 
    PartTime= 2 
} 

public class Client 
{ 
    Employment e = new Employment(); 
// if i build the above code, i should get a error or warning saying you should specify value for EmploymentType 
} 

Répondre

5

Comme cmsjr a déclaré ce que vous devez faire est la suivante:

public class Employment 
{ 
    public Employment(EmploymentType employmentType) 
    { 
     this.EmploymentType = employmentType; 
    } 

    public EmploymentType EmploymentType { get; set; } 
} 

Cela forcera les appelants à passer la valeur à la création comme ceci:

Employment e = new Employment(EmploymentType.FullTime); 

Dans le cas où vous avez besoin d'avoir un constructeur par défaut (comme sérialisation) mais vous voulez toujours appliquer t Il règle alors vous auriez besoin d'une sorte de validation d'état. Par exemple quand vous essayez d'effectuer une opération sur la classe d'emploi, vous pouvez l'avoir vérifier un état valide comme ceci:

public EmploymentType? EmploymentType { get; set; } // Nullable Type 

public void PerformAction() 
{ 
    if(this.Validate()) 
     // Perform action 
} 
protected bool Validate() 
{ 
    if(!EmploymentType.HasValue) 
     throw new InvalidOperationException("EmploymentType must be set."); 
} 

Si vous êtes à la recherche des avertissements du compilateur personnalisés de lancer, ce n'est pas exactement possible. J'ai posé une question similaire ici Custom Compiler Warnings

+0

+1 pour un échantillon de code plus complet que le mien;) -cmsjr – cmsjr

+0

oui ..Je voulais savoir s'il existe un moyen de déclencher une erreur/un avertissement personnalisé en fonction de l'état. On dirait que ce n'est pas possible. Votre lien vers Custom Compiler Warnings a été utile. –

4

Vous pouvez réaliser ce que vous voulez faire en n'ayant pas de constructeur par défaut, et en définissant plutôt un constructeur qui prend le type d'emploi comme argument. Si quelqu'un essayait d'instancier la classe en utilisant un constructeur sans paramètre, il obtiendrait une erreur de compilation.

code EDIT exemple

public Employment(EmploymentType eType) 
    { 
     this.EmploymentType = eType; 
    } 
+1

oui. tu rites là-dessus. Mais que faire si dans les scénarios où un constructeur par défaut est requis. Comme pour la sérialisation? alors le client peut choisir le défaut sur le constructeur paramétré. –

+0

Si vous devez avoir un constructeur public par défaut, je ne sais pas d'une façon que vous pouvez provoquer une erreur de compilation, pour ce qui sera un état d'exécution. – cmsjr

3

principes OO dictent qu'un objet ne doit jamais être dans un état non valide. Donc, cela devrait être un paramètre constructeur.

Il n'y a aucun moyen d'indiquer qu'une propriété est requise au moment de la compilation.

+0

+1 bonne réponse à la question sous-jacente – user7116

3

Vous avez mentionné dans votre message original que vous connaissez déjà le faire avec les constructeurs, ce qui est certainement la bonne façon de le faire. Je ne crois pas qu'il y aura moyen de faire ce que vous voulez, même avec des attributs (ce qui est normalement la façon dont vous manipuleriez les avertissements du compilateur, etc.). Puisque l'objet pourrait être créé et ensuite passé à une autre méthode pour définir le paramètre, ce n'est pas forcément aussi évident que "le client doit spécifier une valeur".

Vous pouvez essayer de créer une coutume FxCop ou VSTS règle d'analyse statique, mais je ne pense pas que vous serez en mesure de le faire avec juste le compilateur C#.

0
Interface Icontrol 
' Declare an interface. 
Property MustHave() As String 

End Interface 

Ensuite, dans votre contrôle utilisateur comprennent

Public Class mycontrol 
Inherits System.Web.UI.UserControl 
Implements Icontrol 

Il rend cette propriété nécessaire