gpt4 book ai didi

c# - 多个包装器 - 怎么做?

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:36 24 4
gpt4 key购买 nike

我有一个代表桌面窗口的 Window 类,其中一些可以通过包装器 (TitledWindow) 来命名,其中一些可以位于其他,也通过包装器 (TopWindow)。

UML View

现在,我正在尝试为 Window 创建 View 模型,我希望它支持这三个接口(interface)(IWindowITitledWindowITopWindow)。它看起来像这样:

public class WindowViewModel : ITopWindow, ITitledWindow
{
private readonly IWindow _window;

public WindowViewModel(IWindow window)
{
_window = window;
}

public IntPtr Handle
{
get { return _window.Handle; }
}

public Boolean? IsTopmost
{
get
{
var thisTopWindow = _window as ITopWindow;
if (thisTopWindow == null)
return null;
return thisTopWindow.IsTopmost;
}
set
{
var thisTopWindow = _window as ITopWindow;
if (thisTopWindow != null)
thisTopWindow.IsTopmost = value;
}
}

public String Title
{
get
{
var thisTitledWindow = _window as ITitledWindow;
return thisTitledWindow == null ? null : thisTitledWindow.Title;
}
}
}

这就是我获取 View 模型的方式:

public IList<WindowViewModel> OpenWindows
{
get
{
var windowViewModels =
from window in _windowEnumerator.EnumerateWindows()
let titledWindow = new TitledWindow(window, _windowTitleReader)
let topWindow = new TopWindow(titledWindow, _topmostManager)
select new WindowViewModel(topWindow);
return windowViewModels.ToList();
}
}

问题是我只能获得层次结构中的第一个st 包装器。

OpenWindows 中的所有窗口也是 ITopWindow,但不是 ITitledWindow 因为它将它包装在 private readonly 字段(应该保持这种方式)。

我想到的唯一解决方案是引入一个将它们合并的类(如 TitledTopWindow),但我必须为窗口的每个变体制作它,这太困惑了(尤其是稍后当我引入新的包装器以引入新功能时)。

正确的做法是什么?

更新:
在我的搜索中,我读到您使用包装器来扩展功能,而不是扩展 API(这是这里的目标)。

因此,如果无法按照我预期的方式解决此问题,我该如何以这种方式添加功能?

最佳答案

我的建议是

 class Window
{
List<object> traits;

T GetTrait<T>()
{
return traits.Where(t => t.GetType() == typeof(T)).FirstOrDefault();
}
}

Window w;
var topLevel = w.GetTrait<TopLevel>();
if (topLevel != null)....

但是这个建议需要对接口(interface)/代码进行认真的修改。

我认为你真的想要像跟随无效代码这样的东西,这样你就可以添加任意数量的包装器,并且仍然让所有接口(interface)在最终类上可见:

 class TopLevel<T> : T where T:Window

我不认为你可以直接实现它(因为你不能从它的模板参数派生模板类)。

一种解决方法是在运行时生成派生类,添加必要的接口(interface)并代理内部类实现的所有接口(interface)。 Dynamically creating a proxy class 中讨论/链接的可能方法(即这个 A simple Dynamic Proxy )。

关于c# - 多个包装器 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com