2010-07-29 8 views
0

HI, J'ai une fonction générique comme indiqué ci-dessous. Il peut être utilisé pour afficher un formulaire en appelantFonction générique nouvelle avec problème de paramètre

showForm(ch);

fonctionne pour la deuxième fonction (nouveau sans paramètre), mais si je veux montrer la forme mais avec le paramètre dans le constructeur comme dans la troisième fonction (nouveau avec le paramètre), alors je ne pourrais pas le faire. N'importe qui a une idée comment le faire?

 void showForm<T>(T frm) where T :Form, new() 
     { 
      if (frm == null) 
      { 
       frm = new T(); 
      } 
      frm.MdiParent = this; 
      frm.Show(); 
     } 


     //Works for this 
     public frmChild2() 
     { 
      InitializeComponent(); 
      ChildToolStrip = toolStrip1; 
      // toolStrip1.Visible = false; 
     } 

     //Does not Work for this 
     public frmChild2(string title) 
     { 
      InitializeComponent(); 
      ChildToolStrip = toolStrip1; 
      Text = title; 
      // toolStrip1.Visible = false; 
     } 
+0

Pouvez-vous montrer des exemples de la façon dont vous appelez votre méthode ShowForm? –

+0

@Matthew Voici comment cela s'appelle ==> showForm (frmObject); – Thunder

Répondre

5

à l'aide Where T : new() indique au compilateur que T a un public constructeur sans arg.

La seconde forme ne possède pas un tel constructeur. D'après ce que vous montrez, il n'y a pas vraiment besoin de définir le titre dans le constructeur (comment la méthode showForm pourrait-elle savoir quoi définir?).

Puisque T est également contraint d'être un Form, vous pouvez définir frm.Text = après l'instanciation de Form.

+0

Merci, il résout problème spécifique. Mais juste curieux de savoir si nous pouvons passer le paramètre à new() peut être quelque chose comme frm = new T ("mon titre"); – Thunder

+0

Vous ne pouvez pas définir dans les contraintes que vous souhaitez avoir un constructeur avec un paramètre de chaîne. Le seul moyen serait d'appeler le constructeur en utilisant la réflexion. –

1

new() garantit que T aura un constructeur public qui ne prend aucun argument - généralement, vous utilisez cette contrainte si vous devez créer une nouvelle instance du type. Vous ne pouvez rien y faire directement.

Cocher cette

Passing arguments to C# generic new() of templated type

Questions connexes