Я столкнулся с проблемой дизайна класса.
Я использую сериализатор контракта данных.
Итак, в сборке, которая является общей для всех моих приложений, у меня есть что-то вроде этого:
// Assembly DataContracts.dll: .NET 3.0, used by every subsystems
[DataContract]
public class User
{
/// <summary>Nickname.</summary>
[DataMember]
public string displayName;
}
Есть еще много полей: я оставил только displayName, пытаясь сжать мои списки кодов.
Однако одно из приложений - это сервер, которому требуется другой сериализатор для применения к тому же классу следующим образом:
// 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 связан с .NET 4. Более того, атрибуты [Ese *] определены в DLL, которая может быть загружена только серверным компонентом по независящим от меня причинам, поэтому я не могу просто иметь один класс с обоими наборами атрибутов, общими для каждой подсистемы.
В настоящее время я написал что-то вроде этого:
// 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;
}
}
Мне не очень нравится мое решение: похоже на взлом и подвержено ошибкам.
Любые другие лучшие идеи, исправления или исправления?
Заранее спасибо!