C# Class 具有名称和任何对象类型的集合

C# Class that has a name and a Collection of any object type

我正在尝试创建一个菜单列表,用户可以从 TreeView select。 select 从树中选择一个菜单后,我想在 window 的单独部分中显示该菜单中的项目。我首先想到的方法是创建一个如下所示的 class:

public class SettingsMenu
{
    public string Name { set; get; }
    public ObservableCollection<object> Items { set; get; }

    public SettingsMenu()
    {
        Name = "";
        Items = new ObservableCollection<object>();
    }

    public SettingsMenu(string _name, ObservableCollection<object> _items)
    {
        Name = _name;
        Items = _items;
    }

    public void AddItem(object _item)
    {
        Items.Add(_item);
    }
}

其中 "Items" 是菜单中的项目。然后,我会为系统中的每个菜单创建一个 class 的新实例,并使用名称和项目的 ObservableCollection 对其进行初始化。

但是,项目可以是多种自定义类型。对于我的问题的基本演示,它相当于:

    MenuInts = new SettingsMenu("Menu1", new ObservableCollection<int>());
    MenuStrings = new SettingsMenu("Menu2", new ObservableCollection<string>());
    MenuBools = new SettingsMenu("Menu3", new ObservableCollection<bool>());

但是我得到一个编译器错误:

Cannot convert from
'System.Collections.ObjectModel.ObservableCollection<type>' to
'System.Collections.ObjectModel.ObservableCollection<object>'

我想使用一个 "Menu" class 以便我可以在 UI 中以一致的方式使用它进行显示和交互。有没有办法让一个 master class 可以包含任何类型的 ObservableCollection?

正如 Ed Plunkett 的评论中所述,您可以将所需的功能抽象为通用接口或基础 class:

public interface ISettingsMenu
{
    string Name { set; get; }

    IEnumerable<object> Items { get; }

   void AddItem(object item);
}


public class SettingsMenu<T> : ISettingsMenu
{
    public string Name { set; get; }

    public ObservableCollection<T> Items { set; get; }

    IEnumerable<object>  ISettingsMenu.Items
    {
        get { return Items.Cast<object>(); }
    }

    public void AddItem(object item)
    {
        throw new System.NotImplementedException();
    }

    public SettingsMenu()
    {
        Name = "";
        Items = new ObservableCollection<T>();
    }

    public SettingsMenu(string _name, ObservableCollection<T> _items)
    {
        Name = _name;
        Items = _items;
    }

    public void AddItem(T _item)
    {
        Items.Add(_item);
    }
}

在此示例中,Items 公开为 IEnumerable - 如果您需要访问 ObservableCollection 以绑定到其事件,您可能需要一个 init 方法到接口,该方法接受要绑定的控件作为参数.