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

問題は、私は、フォームで次のように私は、メソッドを呼び出す

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

の下のようにコンストラクタでいくつかのパラメータを持っているユーザーコントロールの名前userC1からこのメソッドを呼び出すしようとしているときである1

ChangeView<UserC1>(); 

上記のコードはエラーです。 は、パブリックパラメータの少ないコンストラクタを持つ非抽象型で、ジェネリックのパラメータを使用する必要がありますタイプまたは方法。

この問題はどのように解決できますか。 私はuserC1コンストラクタでそのパラメータが必要です。

+3

'T 'が' UserC1'ならば、 'Change = new T()'は 'ChangeView'でどうするのですか? –

+0

シグネチャに 'new()'を使用して、パラメータのないコンストラクタが明示的に必要です。しかし、それを削除すると、異なる署名を持つコンストラクタをどのように呼び出すと思いますか?あなたはそれをどのように知っていますか? 'Foo'にはパラメータのないコンストラクタがありますが、' Bar'にはparamsが必要ですか?あなたはすることはできません、そして、今あなたは一般的な機能を持っていません。親フォームへの参照が必要な場合はなぜ '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; 
    } 
関連する問題