UserControl的通用列表

时间:2018-09-25 00:02:13

标签: c# generics

我正在尝试使用Class<T>List<T>创建Method Add。我可以在其中添加UserControls并且在添加时未实例化它们的位置。只需将它们作为一个类传递,并在需要时实例化它们。

我的问题是,如果我用new UserControlBlaBla()添加它们。然后,为那个UserControl构造函数被调用,我需要在需要时将其保存在内存中,如果需要的话,还需要在显示它时调用方法在其上运行某些东西。

我想使用通用列表制作通用类,并添加该UserControlBlaBla类并在需要时实例化它。

我有这个并且它可以工作,但是当我需要创建Manager类时,我不知道它是哪种类型。如果我放入Manager<UserControl>并尝试Add(UserControlBlaBla),则表明UserControlBlaBla是一种类型,在给定的上下文中无效。没关系,如果我实例化它就可以了,因为只有那时才是UserControl的类型。

class Manager<T>{
    private List<T> _step;

    public void Add(T userControl)
    {
       _step.Add(userControl);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以这样做:

n^3

并像这样使用它:

class Manager
{
    private readonly Dictionary<Type, Delegate> _lazyInstances 
        = new Dictionary<Type, Delegate>();

    public void Add<T>(Func<T> instanceCreator) where T : class
    {
        _lazyInstances[typeof(T)] = instanceCreator;
    }

    public T Get<T>() where T : class 
    {
        return ((Func<T>)_lazyInstances[typeof(T)]).Invoke();
    }
}

答案 1 :(得分:0)

..一种解决方法是对所有UserControl类型使用通用类型,即interface

public interface IUserControl
{
    void OnPress();
}

现在您不需要使用泛型,只需执行以下操作即可

...
public void Add(IUserControl c) {...}
...

如果您想延迟实例化,则可以解决一些问题-idk上下文或推理是您的要求的内容-

using System;
using System.Collections.Generic;
using ...

class Manager
{
    Dictionary<Type, Func<IUserControl>> constructorCache = new Dictionary<Type, Func<IUserControl>>();

    public void Add(Type userControlType, Func<IUserControl> construct)
    {
        // do some checking for existing if you want
        constructorCache[type] = construct;
    }


    public void Get(Type userControlType)
    {
        // check for existing
        return constructorCache[type];
    }
}

要添加到可能的实例的缓存中以进行构建:

var m = new Manager();
m.Add(typeof(SomeUserControl), ()=> new SomeUserControl()); // lambda syntax
m.Add(typeof(OtherUserControl), ()=> new OtherUserControl());
m.Add(typeof(OneMoreUserControl), ()=> new OneMoreUserControl());

,以及当您想要某种类型的实例时:

var construct = m.Get(typeof(SomeUserControl));
var ctrl = construct();

其中:

class SomeUserControl : IUserControl {...}
class OtherUserControl : IUserControl {...}
class OneMoreUserControl : IUserControl {...}

没有测试代码,这只是一个非常基本的概述,但可以使您对该概念有所了解。