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();
    ...    
}