【发布时间】:2013-12-13 06:21:15
【问题描述】:
我有一个类,它将存储从基类派生并实现接口的对象。在这个例子中,所有类型都派生自UIElement,并实现了我的接口IDropTarget。
因此,在我的课堂上,我可以以一种奇妙的方式使用泛型类型推断来要求这一点,而无需将所有内容都限制在特定的基类中
public void AddDropTarget<TTarget>(TTarget target)
where TTarget : UIElement, IDropTarget
{
target.DoSomethingAsUIElement();
target.DoSomethingAsIDropTraget();
// Now I want to save it for another method
list.Add(target);
}
public void DoStuff()
{
foreach(var item in list)
{
item.MoreUIElementAndDropStuff();
}
}
不幸的是,我似乎无法存储此 TTarget 受限列表。我不能将它限制为特定类型,因为我已经有多个从 UIElement 派生的类(矩形、按钮、网格等),而且我无法让所有这些对象都从基类型派生。
我的下一个解决方案是存储每种类型的列表。我需要弄清楚这种开销是否值得与每次使用它们时投射对象相比。
【问题讨论】:
-
你为什么不做
list = new List<UIElement>();? -
在您的情况下,您可以将
UIElement AsUIElement { get; }添加到您的界面。然后你可以有一个IDropTarget的列表并做类似foreach(var item in list) { item.AsUIElement.Focus(); } -
托尼:我不能使用 List
因为我还需要访问 IDropTarget。 -
Kramer:这是一个有趣的解决方案,有点类似于下面 Paolo 的解决方案。我更改了答案以将其标记为最佳答案。
标签: c# inheritance generic-list