У меня есть два класса, как это:
public abstract class MyBase
{
protected MyBase(){
Initialize();
}
protected IDictionary<string,string> _data;
private void Initialize() {
// Use Reflection to get all properties
// of the derived class (e.g., call new MyDerived() then
// I want to know the names "Hello" and "ID" here
var data = GetDataFromBackend(propertyNamesFromDerived);
_data = data;
}
}
public class MyConcrete : MyBase
{
public MyConcrete(){
// Possibly use Reflection here
Hello = _data["Hello"];
ID = new Guid(data["ID"]);
}
public string Hello {get;set;}
public Guid ID {get; set;}
}
Как вы видите, я хочу, чтобы конструктор моего базового класса знал о свойствах производного класса, который я создаю.
Теперь это похоже на огромный и большой запах кода, поэтому позвольте мне рассказать немного о моих намерениях, может быть, есть лучший способ.
У меня есть бэкэнд-система, в которой хранятся пары ключ / значение, по сути, Dictionary<string,string>
. Я хочу абстрагироваться от работы с этой серверной системой таким образом, чтобы люди могли создавать классы, свойства которых являются ключами в серверной системе. Когда они конструируют этот объект, он автоматически загружает данные из этой системы и инициализирует в нем все переменные.
Другими словами, я только что заново изобрел сериализацию, за исключением того, что я не контролирую бэкэнд-систему и просто делаю работу с ней действительно безболезненной. Я не хочу, чтобы вызывающие абоненты вызывали Initialize()
после создания объекта, потому что в 100% случаев вы должны инициализировать его после создания.
Я не хочу перемещать инициализированный код в производные классы, за исключением преобразования строки в бизнес-объект.
Должен ли я использовать Фабрику? Или считается безопасным смотреть на свойство names производного класса в базовом конструкторе? (Не заботьтесь об их значениях и о том, что они не инициализированы, просто нужны имена).
Или есть ли лучший способ создать фасад между Словарём строк и конкретным бизнес-объектом?
Редактировать: Это .net 3.5, поэтому нет System.Dynamic, который сделал бы это тривиальным: (
Редактировать 2: После того, как я посмотрел на Ответы и еще раз обдумал это, я думаю, что мой вопрос действительно сводится к следующему: вызывается GetType (). GetProperties () из базового конструктора по порядку получить имен свойств и если они украшены определенным сейфом атрибута?