Comment puis-je faire une énumération "abstraite" dans une bibliothèque de classes .NET?
Je suis en train de faire un serveur de bibliothèque dans lequel le paquet de l'association se fait par le protocole enum.
public enum ServerOperationCode : byte
{
LoginResponse = 0x00,
SelectionResponse = 0x01,
BlahBlahResponse = 0x02
}
public enum ClientOperationCode : byte
{
LoginRequest = 0x00,
SelectionRequest = 0x01,
BlahBlahRequest = 0x02
}
Qui fonctionne bien lorsque vous travaillez dans votre propre projet, vous pouvez comparer les enum membre est retourné (c'est à dire if (packet.OperationCode == ClientOperationCode.LoginRequest)
). Cependant, puisque c'est une bibliothèque de classe, l'utilisateur devra définir ses propres enum.
Donc, j'ai deux énumérations d'ajouter que "abstrait" - ServerOperationCode et ClientOperationCode. Je sais qu'il n'est pas possible de mettre en œuvre abstraite enum en C#. Comment puis-je faire cela?
source d'informationauteur Lazlo
Vous devez vous connecter pour publier un commentaire.
J'aime utiliser des instances sur mes cours quand j'en ai besoin pour ce faire. Il vous permet d'avoir certaines valeurs par défaut, mais aussi permet d'être extensible par les moyens habituels de l'héritage et des implémentations d'interface:
en supposant
packet.OperationCode
retour d'un octet, vous aurez probablement à mettre en œuvre un opérateur == pour octet. placer ce code dans votre résumé OperationCode classe.cela vous permettra d'avoir la même vérification que vous avez montré:
Pourquoi tout le monde pense que les Énumérations ne peut être abstraite?
Le Système de classe.Enum EST l'abstraction d'une énumération.
Vous pouvez assigner n'importe quelle valeur de l'énumération à un Enum, et vous pouvez la lancer en arrière à l'original de l'énumération ou l'utilisation du nom ou de la valeur.
par exemple:
Ce petit bout de code est à partir d'une propriété dynamique de collecte utilisé dans une de mes bibliothèques de contrôle. Je propriétés à être créé et accessible par une valeur de l'énumération pour le rendre un peu plus rapide, et moins d'une erreur humaine
- Je utiliser
Enum.GetName(Type, object)
pour obtenir le nom de la valeur de l'énumération (à fournir un nom pour la propriété), et pour la vitesse et des raisons de cohérence-je utiliserGetHashCode()
pour retourner la valeur de l'entier de l'énumération des membres (le code de hachage pour un int, c'est toujours juste l'int valeur)Ceci est un exemple de la méthode appelée:
Si vous voulez dire que vous voulez un enum, qui peut être étendu par les clients de la bibliothèque, consultez mon article sur CodeProject le sujet, Symboles extensible enums.
Remarque que dans ma bibliothèque, Symbole choisit les numéros d'ID pour les "valeurs enum" automatiquement, car il est conçu pour une utilisation à l'intérieur d'un seul programme, plutôt que pour l'échange de valeurs sur un réseau. Il serait peut-être possible, cependant, de modifier le Symbole.cs à votre convenance afin que les clients peuvent affecter les valeurs des constantes de symboles.
Créer un Enum pour LoginResponse, SelectionResponse, etc., mais ne pas spécifier les valeurs.
Ont ServerOperationCode et ClientOperationCode mettre en œuvre une fonction qui, étant donné un entier pseudo-code binaire, renvoie la valeur appropriée à partir de votre Enum.
Exemple:
Mise en garde: depuis les interfaces ne pouvez pas définir des fonctions statiques, ServerOperationCode et ClientOperationCode ne serait en mesure de mettre en œuvre une interface commune si cette fonction est une instance de la fonction. Si ils n'ont pas besoin d'implémenter une interface commune, GetOperationCode peut être une fonction statique.
(Excuses pour les C# gags, ce n'est pas ma langue maternelle...)
Si il y a une base de données partagée entre votre client et le serveur d'application, puis les tables de recherche peut aider; la structure de la table juste à contenir une valeur entière (ID) et d'une chaîne de caractères (le nom), ce tableau peut être rempli par chaque côté de votre demande (le client ou le serveur) et lu par les autres. Vous pouvez mettre en cache ces table (code) dans le dictionnaire pour la recherche rapide.
Vous pouvez également mettre en place la même chose dans l'application.fichier de configuration; la force de l'utilisateur de votre bibliothèque pour définir ces valeurs dans l'application.fichier de configuration qui votre bibliothèque pouvez accéder facilement.
J'ai écrit un message de commutation de la bibliothèque avec un scénario similaire a un moment déjà, et j'ai décidé d'utiliser des génériques de passe défini par l'utilisateur enum. Le principal problème avec cela est que vous ne pouvez pas imposer votre générique pour seulement les types enum, mais ne peut dire tout T: struct. Quelqu'un peut instancier votre type avec un autre type primitif (bien que, en utilisant ints pourrait encore être fonctionnel, à condition qu'elles soient toutes les valeurs uniques. Le dictionnaire va lever une exception si elles ne le sont pas. Vous pourriez peut-être ajouter un peu supplémentaire de vérifier à l'aide de la réflexion pour vous assurer de passer un enum.
Donné votre scénario d'exemple, vous devriez juste sous-classe comme ça.
Comment sur l'utilisation de Dictionnaire statique et une méthode virtuelle pour récupérer la statique des dictionnaires dans les classes héritées?
Comme le suivi de votre dossier: