c# - 我有一个辅助类。我应该考虑删除它吗?

标签 c# generics interface refactoring

我正在使用 Telerik 的 Rad Controls for AJAX。我已经创建了自己的控件;它们的类继承自 RadControl 类。我从中继承的所有 Telerik 控件最接近的公共(public)父类是“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 接口(interface),那么我将不得不将 Save 的实现移动到实现 ICormantControl 的每个控件。这将导致大量重复代码。

我是否应该将我的实现留在我的帮助程序类中,将声明移至 ICormantControl,然后在每个实现 ICormantControl 的类中,将实现重定向到我的帮助程序方法?

据我所知,我无法让所有控件都继承自中间类。公共(public)父级位于继承父级控件的层次结构之上。可以扩展 WebControl 并让它实现 Save,但这似乎比我上面的建议差几个数量级。

我还有其他选择吗?

最佳答案

你想要的是一个 extension method .将您的声明更改为:

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

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

关于c# - 我有一个辅助类。我应该考虑删除它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750578/

相关文章:

C# 在 #if DEBUG 中使用语句但不运送程序集

c# - 如何在c#中处理线程

c# - 用户控件的可见属性何时会影响其子项?

swift - Swift 3 中泛型的泛型

c# - 如何使用反射将 System.Type 传递给泛型方法

java - 将 java 泛型用于简单工厂 - 如何避免这些警告

java - 接口(interface)使用

c# - async 和 await 关键字不会导致创建额外的线程?

c# - 更多关于 C# 中的隐式转换运算符和接口(interface)(再次)

Java:接口(interface)和工厂中的泛型