我有一个助手班。我应该考虑将其删除吗?

时间:2011-07-19 16:24:29

标签: c# generics interface refactoring

我正在使用Telerik的Rad Controls 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()

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

我应该将我的实现留在我的帮助器类中,将声明移到ICormantControl,然后,在实现ICormantControl的每个类中,我将实现重定向到我的辅助方法吗?

据我所知,我无法将所有控件都从中间类继承。公共父级在继承父控件的层次结构上太过分了。有可能扩展WebControl并使其实现Save,但这似乎比我的上述建议更糟糕。

我还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

你想要的是extension method。将您的声明更改为:

public static void Save<T>(this ICormantControl<T> control)

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

答案 1 :(得分:1)

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

Pass HtmlHelper instance to another method MVC3 with Razor

 public static void Save<T>(this  ICormantControl<T> control)
 { 
 }

魔法在这个关键字中,所以现在你可以使用doc.Save(),这指向doc。