C# 将表单列表存储在数组中
我有一个程序,需要按给定顺序浏览一系列屏幕。我想做的是集中管理它,使用类似于类工厂的东西,在类工厂中,我发送下一个表单的请求,它实例化并返回下一个表单。但是,我有以下内容,这将立即实例化所有表单:C# 将表单列表存储在数组中,c#,winforms,list,C#,Winforms,List,我有一个程序,需要按给定顺序浏览一系列屏幕。我想做的是集中管理它,使用类似于类工厂的东西,在类工厂中,我发送下一个表单的请求,它实例化并返回下一个表单。但是,我有以下内容,这将立即实例化所有表单: private List<Form> screens = new List<Form>() { new Form1(), new Form2(), … }; private Form currentForm; private int currentPos; public Fo
private List<Form> screens = new List<Form>() { new Form1(), new Form2(), … };
private Form currentForm;
private int currentPos;
public Form Next()
{
currentForm = screens[++currentPos];
return currentForm;
}
private List screens=new List(){new Form1(),new Form2(),…};
私人形式;
私人国际邮政局;
公共表格下一页()
{
currentForm=屏幕[++currentPos];
返回电流表;
}
有没有一种方法可以延迟实例化直到发出实际请求?例如:
private List<Form> screens = new List<Form>() { Form1,Form2, …};
private Form currentFrm;
private int currentPos;
public Form Next()
{
currentForm = new screens[++currentPos];
return currentFrm;
}
private List screens=new List(){Form1,Form2,…};
私有形式的FRM;
私人国际邮政局;
公共表格下一页()
{
currentForm=新屏幕[++currentPos];
返回电流frm;
}
(无法编译)您可以使用代理列表,例如:
List<Func<Form>> screens = new List<Func<Form>>
{
() => new Form1(),
() => new Form2(),
...
};
列表屏幕=新列表
{
()=>新表单1(),
()=>新表单2(),
...
};
一种方法是在列表中存储类型,并使用动态创建表单实例:
private Type[] screenTypes = new Type[] {
typeof(Form1),
typeof(Form2),
...
};
private Form currentForm;
private int currentPos;
public Form Next()
{
currentForm = (Form) Activator.CreateInstance(screenTypes[++currentPos]);
return currentForm;
}
private List screens=new List(){typeof(Form1),typeof(Form2),…};
t型=屏幕[++当前位置];
return(Form)Activator.CreateInstance(t);
另一个选项
public IEnumerable<Form> Forms
{
yield return new Form1();
yield return new Form2();
yield return new Form3();
...
}
公共IEnumerable表单
{
收益率返回新表单1();
收益率返回新表单2();
收益率返回新表单3();
...
}
afaik,如果您确定在结果类型中,您应该使用cast
,而不是操作符作为
@abatishchev,这取决于您是否希望返回null
,或者如果其中一个类型不是从表单派生的,则引发异常。在我们的例子中,您的方法可能是最好的,但我会更新我的答案。收益率回报率
您的意思可能是:)
public IEnumerable<Form> Forms
{
yield return new Form1();
yield return new Form2();
yield return new Form3();
...
}