2016-10-27 4 views
0

В моей форме1 У меня есть этот метод.Общий вызов класса, который имеет параметры

public void ChangeView<T>() where T : Control, new() 
    { 
     if (transitionManager1.IsTransition) 
     { 
      transitionManager1.EndTransition(); 
     } 

     transitionManager1.StartTransition(BasePanel); 
     try 
     { 

      T find = Find<T>(BasePanel); 
      if (find != null) 
      { 
       find.BringToFront(); 
      } 
      else 
      { 
       find = new T(); 
       find.Parent = BasePanel; 
       find.Dock = DockStyle.Fill; 
       find.BringToFront(); 
      } 

     } 
     finally 
     { 
      transitionManager1.EndTransition(); 
     } 
    } 

проблема, когда я пытаюсь вызвать этот метод из пользовательского элемента управления с именем userC1, которые имеют некоторые параметры в конструкторе, как показано ниже

Form1 f; 
    public UserC1(Form1 f) 
    { 
     InitializeComponent(); 
     this.f = f; 
    } 

я вызываю метод следующим образом в виде 1

ChangeView<UserC1>(); 

но выше код - это ошибка, о которой говорит должен быть не абстрактный тип с открытым конструктором с меньшим значением, чтобы использовать его в качестве параметра в общем типа или метода.

как я могу исходить из этой проблемы. Мне нужны эти параметры в конструкторе userC1.

+3

Ну что вы ожидаете 'find = new T()' делать в 'ChangeView', если' T' '' UserC1'? –

+0

Вам явно требуется конструктор без параметров с помощью 'new()' в сигнатуре. Однако, если вы удалите это, как вы представляете себе вызов конструктора с разными сигнатурами? Как вы узнаете, что, например, 'Foo' имеет конструктор без параметров, но' Bar' требует параметров? Вы не можете, и теперь у вас нет общей функции. Если вам нужна ссылка на родительскую форму, почему бы просто не использовать 'Control.Parent'? –

ответ

0

Я редактировать код следующим образом и добавить интерфейс для моего кода следующим образом ...

T Find<T>(Control container) where T : Control 
    { 
     for (int i = 0; i < container.Controls.Count; i++) 
     { 
      if (container.Controls[i] is T) 
      { 
       return (T)container.Controls[i]; 
      } 
     } 
     return null; 
    } 

public void ChangeView<T>(Func<INavigationControl, T> createTInstance) where T : Control, new() 
    { 
     if (transitionManager1.IsTransition) 
     { 
      transitionManager1.EndTransition(); 
     } 

     transitionManager1.StartTransition(BasePanel); 
     try 
     { 

      T find = Find<T>(BasePanel); 
      if (find != null) 
      { 
       find.BringToFront(); 
      } 
      else 
      { 
       if (createTInstance == null) 
        find = new T(); 
       else 
        find = createTInstance(this); 
       find.Parent = BasePanel; 
       find.Dock = DockStyle.Fill; 
       find.BringToFront(); 
      } 

     } 
     finally 
     { 
      transitionManager1.EndTransition(); 
     } 
    } 




public interface INavigationControl 
{ 
    void ChangeView<T>(Func<INavigationControl, T> createTInstance) where T : Control, new(); 
} 

Затем я добавил этот код, чтобы позвонить моему изменить метод вида

ChangeView (форма => новой Configurationn (форма));

Для этого нам нужно отредактировать конструктор.

INavigationControl1 f1; 
    public YourForm(INavigationControl1 f1) :this(){ 
     this.f1 = f1; 
    } 
Смежные вопросы