我正在使用Telerik的Rad Control for AJAX。我创建了自己的控件;它们的类继承自RadControl类。我要从中继承的所有Telerik控件最接近的公共父类是“ WebControl”。我正在讨论的控件都实现了ICormantControl,它没有太多用处:
public interface ICormantControl<T>
{
T GetSettings();
}
现在,在助手类中,我有几种方法。我想从一个我相信有最大机会做某件事的人开始。
/// <summary>
/// Saves a control -- writing it to Session and the DB.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="control"></param>
public static void Save<T>(ICormantControl<T> control)
{
T settings = control.GetSettings();
string controlID = ((ISetting)settings).ID;
SerializableDictionary<string, T> states = GetStates<SerializableDictionary<string, T>>();
bool isKnown = states.ContainsKey(controlID);
if (isKnown)
{
Logger.DebugFormat("{0} is known. Overwriting data.", controlID);
states[controlID] = settings;
}
else
{
Logger.DebugFormat("{0} is unknown. Saving data.", controlID);
states.Add(controlID, settings);
}
SetStates<SerializableDictionary<string, T>>(states);
}
当前,例如,要保存控件的状态,请调用
StateManager.Save<RadDockSetting>(dock)
。我相信更好的实现将使我能够说
dock.Save()
。正如我所看到的,我被困在一块岩石和一块硬地之间。我的印象是,如果将保存的声明移动到我的ICormantControl接口,则必须将保存的实现移动到实现ICormantControl的每个控件中。这将导致大量重复的代码。
我是否应该将实现留在助手类中,然后将声明移至ICormantControl,然后在实现ICormantControl的每个类中将实现重定向到助手方法?
据我所知,我不能让我的所有控件都从中间类继承。通用父级距离继承的父级控件的层次结构太远。可以扩展WebControl并使其实现保存,但这似乎比我上面的建议差几个数量级。
我还有其他选择吗?
最佳答案
您想要的是extension method。将声明更改为此:
public static void Save<T>(this ICormantControl<T> control)
然后,您无需修改ICormantControl接口或任何其他类就可以执行
dock.Save()
。关于c# - 我有一个帮助类。我应该考虑删除它吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6750578/