C# 通用接口中的Getter和Setter-这可能吗?

C# 通用接口中的Getter和Setter-这可能吗?,c#,generics,C#,Generics,还在学习C泛型的方法。。。是否有可能实现此功能 public interface ISetting<T> { void SetSettings(T obj); // myTypeHere GetSettings(T obj); } public class RadDockSetting : ISetting<CormantRadDock> { public RadDockSetting() { } public RadD

还在学习C泛型的方法。。。是否有可能实现此功能

public interface ISetting<T>
{
    void SetSettings(T obj);
    // myTypeHere GetSettings(T obj);
}

public class RadDockSetting : ISetting<CormantRadDock>
{
    public RadDockSetting()
    {
    }

    public RadDockSetting GetSettings(CormantRadDock dock)
    {
    }

    public void SetSettings(CormantRadDock dock)
    {
    }
 }
我意识到这是一种违反直觉的使用Getter的方式——不应该向它传递任何东西。我正在做的是创建一个对象RadDockSetting,它存储CormantRadDock的相关属性,然后返回“get”设置

GetSettings目前是一个静态方法,但我意识到这需要重构,以便允许从接口实现getter。也许一旦发生这种情况,获得者的“古怪”就会消失

所以,请介绍一下所有这些的背景:

我从一个有很多“复制/粘贴”函数的类开始。这些功能负责保存和删除管理器中的控件。当我意识到这一点时,我开始尝试使这些函数更通用。在苏的帮助下,我成功地使它成为通用的

以下内容仅供参考:

public static void Remove<T>(string controlID) where T: new()
{
    Logger.InfoFormat("Removing control {0}", controlID);
    T states = RadControlStates.GetStates<T>();
    (states as IDictionary).Remove(controlID);
    RadControlStates.SetStates<T>(states);
}
它的名称是:RadControlSave.RemoveID

现在,我试图将这种通用性扩展到其余的方法——saver。以下是其中一种方法当前的外观:

public static void SavePane(CormantRadPane pane)
{
    Logger.InfoFormat("Saving pane {0}", pane.ID);
    RadPaneSetting paneSettings = RadPaneSetting.GetSettings(pane);
    SerializableDictionary<string, RadPaneSetting> paneStates = RadControlStates.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);
    }

    RadControlStates.SetStates<SerializableDictionary<string, RadPaneSetting>>(paneStates);
}
在这个代码块的开头,有一个对RadPaneSetting.GetSettingspane的调用

RadPaneSettings实现ISettings接口。这是正在使用的ISetting的setter

/// <summary>
/// Recreates a dashboard control based off of its settings.
/// </summary>
/// <typeparam name="T"> The type of control to be recreated. </typeparam>
/// <param name="settings"> The known settings needed to recreate the control.</param>
/// <returns> The recreated control. </returns>
public static T Recreate<T>(ISetting<T> settings) where T : new()
{
    T _control = new T();
    settings.SetSettings(_control);
    Logger.DebugFormat("Recreated control {0}", (_control as Control).ID);
    return _control;
}

看起来您只需要在此处添加另一个泛型参数

public interface ISetting<T1, T2>
{
    void SetSettings(T1 obj);
    T2 GetSettings(T1 obj);
}

public class RadDockSettings : ISetting<CormantRadDock, RadDockSetting>

您的问题不太清楚,但您是否需要房产:

public interface ISetting<T>
{
    T Setting { get; set; }
}

public class RadDockSetting : ISetting<CormantRadDock>
{
    public CormantRadDock Setting { get; set; }
}

嗯,可能没有抓住重点

但是为什么设置类会有一个getSettings调用呢?它会退回这个吗


set需要一个dock来初始化实例,然后get仅仅是实例。

我不确定您想要做什么。 也许一个扩展方法可以做到这一点,而不是在接口中设置一个方法。。。诸如此类:

public static T GetSettings<T,C>(this T t, C c) where T : ISetting<C>
{
    return t;
}

希望这有助于…

如果您像@jaredPar所指出的那样定义另一个通用参数,那么您所拥有的将起作用。不过,您可能需要考虑使用扩展方法而不是类方法。它将允许您使用更干净的API来获取设置

样本:

public static class RadDockExtensions
{
    public static RadDockSetting GetSettings(this CormantRadDock dock)
    {
        // Implementation
    }
}
或者如果你想要更普通的东西

public static class RadDockExtensions
{
    public static U GetSettings<T,U>(this T dock)
    {
        // Implementation
    }
}

我不明白你想做什么。那么让我再添加一些代码吧!你可以在那里还我一张票。但是再想想你真正想要在这里实现什么,我认为GetSettings和SetSettings应该是CormantRadDoc上的方法,而不是RadDockSettings上的方法。我有一个码头,有什么设置?RadDockSettings settings=mydock.GetSettings和定义了{get;set;}的设置可以是settings=mydock.settings我真的同意你的评论,Stephen。这段代码让我感觉有些不对劲,但我还没有坐下来认真思考。我要调查一下这件事。非常感谢。嘿,谢谢你的详细回复!我继续向我的问题添加了更多的背景信息。我相信我在做一些根本上/逻辑上不正确的事情,它现在才显现出来,因为它是如何崩溃的。不过,我将阅读扩展方法。谢谢是的,你做到了。现在有了额外的背景,这实际上更有意义。看看扩展方法给您带来了什么。当然,它们是编译器的糖,但它们可以使调用您所拥有的那种代码少一些噪音,这总是一件好事。
RadDockSetting mySettings = myDock.GetSettings();