C# I';我有一个助手班。我应该考虑删除它吗?

C# I';我有一个助手班。我应该考虑删除它吗?,c#,generics,interface,refactoring,C#,Generics,Interface,Refactoring,我正在使用Telerik的Rad控件进行AJAX。我创造了自己的控制;它们的类继承自RadControl类。我所继承的所有Telerik控件的最接近的公共父类是“WebControl”。我所讨论的控件都实现了ICORMATCONTROL,但没有太多内容: public interface ICormantControl<T> { T GetSettings(); } 公共接口ICormantControl { T GetSettings(); } 现在,在我的助手类中,我

我正在使用Telerik的Rad控件进行AJAX。我创造了自己的控制;它们的类继承自RadControl类。我所继承的所有Telerik控件的最接近的公共父类是“WebControl”。我所讨论的控件都实现了ICORMATCONTROL,但没有太多内容:

public interface ICormantControl<T>
{
    T GetSettings();
}
公共接口ICormantControl
{
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);
    }
//
///保存控件--将其写入会话和数据库。
/// 
/// 
/// 
公共静态无效保存(ICormantControl控件)
{
T settings=control.GetSettings();
字符串控制ID=((ISetting)设置).ID;
SerializableDictionary states=GetStates();
bool isKnown=states.ContainsKey(controlID);
如果(已知)
{
DebugFormat(“{0}已知。正在覆盖数据。”,controlID);
状态[controlID]=设置;
}
其他的
{
DebugFormat(“{0}未知。正在保存数据。”,controlID);
添加(控制ID、设置);
}
集合状态(状态);
}
目前,为了保存控件的状态,我调用了
StateManager.save(dock)
,例如

我相信更好的实现将使我能够说
dock.Save()

在我看来,我被夹在岩石和坚硬的地方之间。我的印象是,如果我将Save声明移动到我的ICormantControl接口,那么我必须将Save的实现移动到实现ICormantControl的每个控件。这将导致大量重复的代码

我是否应该将实现留在helper类中,将声明移动到ICormantControl,然后在实现ICormantControl的每个类中,将实现重定向到我的helper方法

就我所知,我不能让我的所有控件都继承自中间类。公共父控件在继承的父控件层次结构中的位置太高。也许可以扩展WebControl并让它实现Save,但这似乎比我上面的建议要糟糕几个数量级

我还有其他选择吗?

您想要的是一个。将您的声明更改为:

public static void Save<T>(this ICormantControl<T> control)
公共静态无效保存(此ICormantControl控件)
然后您就可以执行dock.Save(),而无需修改ICormantControl接口或任何其他类。

您需要的是一个。将您的声明更改为:

public static void Save<T>(this ICormantControl<T> control)
公共静态无效保存(此ICormantControl控件)

然后您就可以执行dock.Save(),而无需修改ICormantControl接口或任何其他类。

扩展方法将解决您的问题。 如何编写扩展方法的示例

公共静态无效保存(此ICormantControl控件)
{ 
}

神奇之处在于这个关键字,所以现在您可以使用doc.Save()来指向doc

扩展方法可以解决您的问题。 如何编写扩展方法的示例

公共静态无效保存(此ICormantControl控件)
{ 
}

神奇之处在于这个关键字,所以现在您可以使用doc.Save()来指向doc

不认为在此时调用save时可以避免说“this”吗?我在我的拉多克班。我想保存我所在的实例。调用Save()会导致错误“名称“Save”在当前上下文中不存在”,但我可以这么说。Save()@Sean,我不确定在从扩展类内部调用扩展方法时是否可以避免对
this
的引用。你可以试着问一个单独的问题。谢谢你的帮助。非常感谢。要更深入地了解我已经使用了一段时间的代码是非常困难的。难道不认为在此时调用save时可以避免说“this”吗?我在我的拉多克班。我想保存我所在的实例。调用Save()会导致错误“名称“Save”在当前上下文中不存在”,但我可以这么说。Save()@Sean,我不确定在从扩展类内部调用扩展方法时是否可以避免对
this
的引用。你可以试着问一个单独的问题。谢谢你的帮助。非常感谢。要深入了解我已经使用了一段时间的代码,真的很难。