2011-01-17 2 views
2

У меня есть программа, которая должна перемещаться по серии экранов в заданном порядке. То, что я хотел бы сделать, - это управлять этим централизованно, используя что-то аналогичное фабрике классов, где я отправляю запрос для следующей формы, и он создает экземпляр и возвращает следующую форму. У меня есть следующий, однако, это будет экземпляр всех форм сразу:Хранить список форм в массиве

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<Form> screens = new List<Form>() { Form1,Form2, …}; 
private Form currentFrm; 
private int currentPos; 

public Form Next() 
{    
    currentForm = new screens[++currentPos]; 
    return currentFrm; 
} 

(это не скомпилируется)

ответ

2

Один из способов сделать это, чтобы сохранить типы в списке и использовать Activator.CreateInstance() динамически создавать формы экземпляры:

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; 
} 
+0

AFAIK, если вы будете уверены, что в результате типа, вы должны использовать 'cast', а не оператор' как' – abatishchev

+1

@abatishchev, ну, что зависит, если вы хотите, чтобы вернуться 'null' или выдавать исключение, если один из типов не получается из' Form'. В нашем случае ваш подход, вероятно, лучше всего, но я обновлю свой ответ. –

0

Вы можете использовать список делегатов, например:

List<Func<Form>> screens = new List<Func<Form>> 
{ 
() => new Form1(), 
() => new Form2(), 
    ... 
}; 
0
private List<Type> screens = new List<Type>() { typeof(Form1), typeof(Form2), … }; 

Type t = screens[++currentPos]; 
return (Form)Activator.CreateInstance(t); 
0

Другой вариант ...

public IEnumerable<Form> Forms 
{ 
    yield return new Form1(); 
    yield return new Form2(); 
    yield return new Form3(); 
    ...  
} 
+0

'yield return' вы, вероятно, имеете в виду :) – leppie

+0

о да - я изменю его - спасибо –

Смежные вопросы