通用接口中的Getter和Setter-这可能吗
本文关键字:Setter- Getter 接口 | 更新日期: 2023-09-27 17:58:49
仍在学习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的相关属性,然后返回"got"设置。
GetSettings是当前的一个静态方法,但我意识到这需要重构,以便允许从接口实现getter。也许一旦这种情况发生,吸气剂的"怪异"就会消失?
所以,关于这一切的一些背景:
我从一个有很多"复制/粘贴"功能的类开始。这些职能部门负责保存和删除经理的控制。当我意识到这一点时,我开始尝试使这些函数更通用。在SO的帮助下,我成功地使remove成为泛型。
供参考,此处删除:
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.Remove<SerializableDictionary<string, RadPaneSetting>>(ID);
现在,我正试图将这种泛型扩展到其他方法——保存程序。以下是其中一种方法目前的样子:
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.GetSettings(窗格)"的调用
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; }
}
如果您定义另一个泛型参数(正如@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
}
}
尽管在这种情况下,您需要添加一些约束来实际创建实现
我还不完全清楚SetSettings
方法的目的是什么,因为您似乎在向GetSettings
发送相同的对象。
在这两种情况下,你都会像这样使用上面的代码:
RadDockSetting mySettings = myDock.GetSettings();
hmmmm可能没有抓住要点。
但是为什么设置类会有getSettings调用呢?它会只返回this
吗?
集合取一个dock初始化实例,然后get只是实例。
我真的不确定你想做什么。也许扩展方法可以做到这一点,而不是接口ISetting。。。类似的东西:
public static T GetSettings<T,C>(this T t, C c) where T : ISetting<C>
{
return t;
}
希望这能帮助。。。