2009-12-09 7 views
1

Utilisation de .Net Je hérite d'une classe plus ancienne dont les paramètres DateTime et bool font partie de son constructeur. Ces valeurs sont extraites d'une base de données SQL et dans la base de données SQL, ces valeurs peuvent être nulles. Lorsque je remplis ma classe et que j'appelle le constructeur de base, cela échoue car DateTime et bool ne peuvent pas avoir de valeurs nulles dans .Net. Je connais les types Nullable (DateTime? Etc.) et je peux définir mes classes personnalisées pour les utiliser et conserver les valeurs nulles mais je n'ai pas réussi à trouver un moyen de transférer la valeur nulle dans un valeur que l'ancienne classe avec le DateTime pourrait accepter. Je déteste cette idée, mais j'ai pensé à utiliser une propriété pour traduire le null en une date fictive, puis de nouveau, mais il n'y a aucun moyen de déterminer qui appelle la propriété, donc je ne saurais pas quand alimenter un null ou une date fictive de retour de l'obtenir.Valeurs DateTime/bool et Null dans .Net

Toutes les idées seraient grandement appréciées.

+1

Je ne veux pas tirer une réponse pour cela, mais ... 'DateTime.MinValue' pourrait être ce que vous cherchez –

+0

Je ne pense pas que vous puissiez y parvenir sans modifier ce vieux –

Répondre

3

Nous utilisons généralement DateTime.MinValue pour ce genre de chose si vous ne pouvez pas utiliser DateTime? dans l'ancien code.

+0

D'accord, la plus grande partie de l'infrastructure principale reconnaît 'DateTime.MinValue' comme une date nulle. –

+0

Si une propriété de ma classe est SomeDate qui peut être annulée lorsque j'appelle cette propriété pour pousser la valeur dans l'ancienne classe qui utilise DateTime, elle doit appuyer sur MinValue si j'appelle la propriété de mon EntityFramework (fait automatiquement dans les coulisses J'ai besoin de la valeur Null Comment puis-je déterminer quelle valeur envoyer à chaque appelant? Je vais avoir encore plus d'un problème pour bool puisque vous ne pouvez vraiment pas substituer une valeur bidon et savoir que c'est faux à moins que je utiliser plusieurs variables (ie valeur pour valeur temporaire et valeur indiquant que la valeur temp est vraiment une valeur fictive – Jay

+0

@Jay - Je suis désolé, je ne connais pas de bonne façon de gérer bool puisque c'est essentiellement une valeur binaire. Comme vous le faites remarquer, il n'y a aucun moyen de savoir que cette valeur est nulle sans introduire une autre variable.Mon meilleur conseil serait de chercher à modifier l'ancienne classe si vous avez vraiment besoin de cette fonction. lité de manipuler les nulls pour bool. – dcp

1

Vous pouvez utiliser le null coalescing operator pour utiliser "la valeur actuelle ou une valeur par défaut si elle est manquante". Comme mentionné dans une autre réponse, la date par défaut serait une sentinal telle que DateTime.MinValue.

private static readonly DateTime DefaultDate = ...; 

... 

DateTime? optionalDate = ...; 
DateTime date = optionalDate ?? DefaultDate; 
0

L'ancienne classe avec un datetime peut accepter n'importe quel datetime, donc toute valeur fonctionnerait ... (mais je recommanderais d'utiliser DateTime.MinValue comme d'autres l'ont suggéré). Ce qui vous intéresse peut-être plus (correctement) est le comportement du code client qui utilise les instances de l'ancienne classe lorsqu'une instance a cette valeur "magique" qui représente une valeur nulle.

Les clas les plus anciens sont-ils scellés? Sinon, pouvez-vous créer une nouvelle classe dérivée avec une propriété booléenne DateTimeIsDefined supplémentaire, et le code approprié pour se comporter de la manière appropriée lorsque l'indicateur n'est pas défini (indiquant que DateTime est indéfini - si l'ancienne classe a ses méthodes déclarées comme virtual, vous pouvez les remplacer dans la classe dervied avec cette nouvelle implémentation qui prend en compte la propriété DateTimeIsDefined ... et les clients qui ont été transmis aux instances de l'ancienne classe exécuteront toujours l'ancienne implémentation, alors que les clients transmettent des instances de la nouvelle classe

+0

Je ne pense pas que l'ancienne classe soit scellée car l'OP mentionne qu'il en hérite en première ligne. – SKG