Je suis confronté à un problème de conception de classe. J'utilise le sérialiseur de contrat de données.Deux ensembles d'attributs de sérialisation sur la même classe
Ainsi, dans l'assemblée qui est partagée entre toutes mes applications, j'ai quelque chose comme ceci:
// Assembly DataContracts.dll: .NET 3.0, used by every subsystems
[DataContract]
public class User
{
/// <summary>Nickname.</summary>
[DataMember]
public string displayName;
}
Il y a beaucoup d'autres champs: Je l'ai laissé que DisplayName essayer de compacter mes listes de codes.
Cependant, l'une des applications est un serveur, qui a besoin d'une autre sérialiseur à appliquer à la même classe, de la manière suivante:
// Assembly ServerDatabase.dll, .NET 4.0, used only by server.
[EseTable]
public class User
{
/// <summary>Nickname.</summary>
[EseText(bUnicode=true, maxChars=71)]
public string displayName;
}
ServerDatabase.dll est lié à 4. .NET En outre, Les attributs [Ese *] sont définis dans une DLL qui peut uniquement être chargée par le composant serveur pour des raisons de sécurité hors de mon contrôle, donc je ne peux pas avoir une seule classe avec les deux ensembles d'attributs partagés par chaque sous-système.
Actuellement, j'ai écrit quelque chose comme ceci:
// DataContracts.dll
[DataContract]
public class User
{
[DataMember]
public string displayName;
}
// ServerDatabase.dll
[EseTable]
public class UserRecord: User
{
[EseText(bUnicode=true, maxChars=71)]
new public string displayName { get { return base.displayName; } set { base.displayName=value; } }
// Note I need to implement an upcasting copy constructor, to convert from User to UserRecord :-(
public UserRecord(User that)
{
base.displayName=that.displayName;
}
}
Je ne aime pas vraiment ma solution: ressemble à un hack, et sujette aux erreurs. Des idées, corrections ou corrections différentes?
Merci d'avance!
Point mineur, mais les champs publics: pas une bonne idée. –