通用控件列表

时间:2017-12-08 09:16:04

标签: c# dictionary generics

我正在研究产品计算器程序。在应用内部,代表销售人员可以搜索客户ID,该应用程序向他显示他可以向客户提供哪些服务以及他的销售条款。根据从数据库下载的数据生成表单。 现在我正在尝试将生成的控件存储在列表中。每次搜索时,我都会处理控件并清除列表。我似乎无法工作的是将所有列表存储在单个字典中。

像这样......

public class ListOfControls<T> : IListOfControls<T> where T : Control
{
    private readonly List<T> _controlsList;

    public ListOfControls()
    {
        _controlsList = new List<T>();
    }

    public void AddControll(T control)
    {
        _controlsList.Add(control);
    }

    public T this[int number]
    {
        get
        {
            return _controlsList[number];
        }
    }

    public void ClearControls()
    {
        _controlsList.Clear();
    }

    public T Last()
    {
        return _controlsList.Last();
    }
}

class DictionaryOfControlsLists
{
    //will be private - public only for test
    public readonly Dictionary<string, IListOfControls<Control>> _dictionaryOfLists;

    public DictionaryOfControlsLists()
    {
            _dictionaryOfLists = new Dictionary<string, IListOfControls<Control>>();
    }

    //Other code....

}

现在尝试实施......

DictionaryOfControlsLists _testDict = new DictionaryOfControlsLists();
_testDict._dictionaryOfLists.Add("test", new ListOfControls<Label>());

可悲的是,这不会奏效......有什么想法吗?致谢

1 个答案:

答案 0 :(得分:1)

你需要的是这样的东西:

class DictionaryOfControlsLists
{
    private readonly Dictionary<Type, IListOfControls<Control>> _dictionaryOfLists = new Dictionary<Type, IListOfControls<Control>>();

    public void Add<T>(T control) where T : Control
    {
        if (!_dictionaryOfLists.ContainsKey(typeof(T)))
        {
            _dictionaryOfLists[typeof(T)] = new ListOfControls<Control>();
        }
        _dictionaryOfLists[typeof(T)].AddControl(control);
    }

    public T Get<T>(int number) where T : Control
    {
        if (!_dictionaryOfLists.ContainsKey(typeof(T)))
        {
            _dictionaryOfLists[typeof(T)] = new ListOfControls<Control>();
        }
        return _dictionaryOfLists[typeof(T)][number] as T;
    }
}

然后你可以这样做:

DictionaryOfControlsLists _testDict = new DictionaryOfControlsLists();
_testDict.Add<Label>(new Label());
Label label = _testDict.Get<Label>(0);

如果您需要将其扩展为string key,那么您需要在DictionaryOfControlsLists中实现双字典来处理它 - 类似于Dictionary<Type, Dictionary<string, IListOfControls<Control>>>