Я пытаюсь реорганизовать следующий код:
public static void SaveSplitbar(RadSplitBar splitBar)
{
Logger.InfoFormat("Saving splitBar {0}", splitBar.ID);
RadSplitBarSetting splitbarSettings = splitBar.GetSettings();
SerializableDictionary<string, RadSplitBarSetting> splitBarStates = GetStates<SerializableDictionary<string, RadSplitBarSetting>>();
bool splitbarIsKnown = splitBarStates.ContainsKey(splitbarSettings.ID);
if (splitbarIsKnown)
{
Logger.Debug("SplitBar is known. Overwriting data.");
splitBarStates[splitbarSettings.ID] = splitbarSettings;
}
else
{
Logger.Debug("SplitBar is unknown. Saving data.");
splitBarStates.Add(splitbarSettings.ID, splitbarSettings);
}
RadControlManager.SetStates<SerializableDictionary<string, RadSplitBarSetting>>(splitBarStates);
}
Логика кода используется повторно для сохранения различных других объектов. Я пытаюсь сделать этот код более общим, чтобы у меня был один метод Save (), а не SaveX (), SaveY () и SaveZ (), выполняющие одну и ту же работу над разными объектами.
Однако у меня есть небольшая загвоздка. Хотя все объекты, передаваемые в Save, имеют метод «GetSettings ()», многие из них имеют этот метод, определенный в методе расширения:
//RadControlExtensions.cs Extension Methods
public static RadSplitBarSetting GetSettings(this RadSplitBar splitbar)
{
RadSplitBarSetting radSplitbarSetting = new RadSplitBarSetting(splitbar.ID, splitbar.Parent.ID, splitbar.CollapseMode, splitbar.AdjacentPanesNames);
return radSplitbarSetting;
}
Таким образом, когда я попытался реорганизовать SaveSplitbar, я понял, что мне нужно будет включить тип моего параметра. Когда я начал идти по этому пути, я подумал: «Ну, это глупо, если мне нужно определить тип объекта, я просто должен написать несколько раз Save в качестве методов расширения для каждого объекта».
Хотя это и есть "ОК", я недоволен им. Логика сохранения каждого типа управления идентична, и я бы предпочел, чтобы в моем классе расширений не было логики копирования / вставки.
Моей следующей мыслью было: «Хорошо, если какой-либо параметр, переданный в Save, гарантированно имеет метод GetSettings - возможно, есть способ получить интерфейс IRadControlExtensions, который предоставляет этот метод. Я не смог определить ни один такой способ, как каждый метод GetSettings имеет свою сигнатуру - не представляется возможным объявить об этом только один раз в интерфейсе.
Так вот где я. Как я должен подходить к этой проблеме?
РЕДАКТИРОВАТЬ: Другой метод сохранения
public static void SavePane(CormantRadPane pane)
{
Logger.InfoFormat("Saving pane {0}", pane.ID);
RadPaneSetting paneSettings = pane.GetSettings();
SerializableDictionary<string, RadPaneSetting> paneStates = GetStates<SerializableDictionary<string, RadPaneSetting>>();
bool paneIsKnown = paneStates.ContainsKey(paneSettings.ID);
if (paneIsKnown)
{
Logger.Debug("Pane is known. Overwriting data.");
paneStates[paneSettings.ID] = paneSettings;
}
else
{
Logger.Debug("Pane is unknown. Saving data.");
paneStates.Add(paneSettings.ID, paneSettings);
}
RadControlManager.SetStates<SerializableDictionary<string, RadPaneSetting>>(paneStates);
}
РЕДАКТИРОВАТЬ 2: Возможно, лучший вопрос: «Когда пора прекратить расширение класса и начать создавать новый класс, который наследует от класса, который в настоящее время расширяется?»