如何在不重写的情况下将属性添加到类中

本文关键字:添加 属性 情况下 重写 | 更新日期: 2023-09-27 18:29:15

我正在尝试扩展TreeViewItem以添加属性。使它复杂的是,它有一个"Items"属性,该属性是同一类类型的列表。添加属性将需要我覆盖子属性,而我不想这样做。以下是原始TreeViewItem:

public class TreeViewItem : NavigationItem<TreeViewItem>, INavigationItemContainer<TreeViewItem>, ITreeViewItem
{
    public IList<TreeViewItem> Items { get; }
}

如何在不强制覆盖"Items"属性的情况下添加MyProperty。"Items"属性发生了很多我不想重新创建的事情。谢谢你的帮助或建议。

如何在不重写的情况下将属性添加到类中

听起来您想用一个定义非常不同的属性来替换Items属性。如果是,则使用new

public class MyItem : TreeViewItem {
  public new List<SomethingElse> Items { 
    get { ... }
  }
}

通常,使用new被认为是不好的做法。在某些特定情况下,它是必要的/有用的,但总的来说,它是不受欢迎的。一个更具体命名的属性通常是这种行为的一个很好的中间地带

正如JaredPar所建议的,您可以使用new IList<MyExtendedTreeViewItem> Items属性隐藏Items属性。这不会替换基类的Items属性,因此必须同步它们。您可以通过实现一个(私有或内部)类来包装基类的项集合来实现这一点:

class ItemsWrapper : IList<MyExtendedTreeViewItem>
{
    private IList<TreeViewItem> _baseItems;
    public ItemsWrapper(IList<TreeViewItem> baseItems)
    {
        _baseItems = baseItems;
    }
    public void Add(MyExtendedTreeViewItem item)
    {
        _baseItems.Add(item);
    }
    // much of implementation omitted here for brevity
    public MyExtendedTreeViewItem this[int index]
    {
        get { return (MyExtendedTreeViewItem)_baseItems[index]; }
        set { _baseItems[index] = value; }
    }
}

和:

class MyExtendedTreeViewItem : TreeViewItem
{
    private ItemsWrapper _items;
    public MyExtendedTreeViewItem()
    {
        _items = new ItemsWrapper(base.Items);
    }
    public new IList<MyExtendedTreeViewItem> Items { get { return _items; } }
}

这并不完全是类型安全的,因为有人可以获得对基Items属性的引用,然后向其添加TreeViewItem,而对MyExtendedTreeViewItem的强制转换会引发异常。

您可以使用扩展方法,而不使用属性,如下所示:

public static class TreeViewItemExtensions
{
   public static object GetPropertyValue(this TreeViewItem tvi)
   {
   }
}

无需重写任何内容,并且可以使用新方法"扩展"TreeViewItem

希望这能有所帮助。

我认为你应该创建一个扩展方法,就像这里解释的那样-

http://msdn.microsoft.com/en-us/library/bb383977.aspx

而不是覆盖TreeViewItem。

要么重写它并调用base。项,或者您用关键字"new"标记您的版本,这会导致只有当调用者明确知道对象属于您的新类类型时才使用您的方法版本。这取决于你的需要,但前者要常见得多。