我正在尝试使用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);
}
}
答案 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 {...}
没有测试代码,这只是一个非常基本的概述,但可以使您对该概念有所了解。