2012-08-10 35 views
0

我知道标题有误导性,但我无法想象这个问题会更好。我有一个程序显示一个表单,允许用户从其他程序中选择运行。然后我试图创建一些通用代码来调用表单。不确定没有重复代码的最佳方法。这是我想要做的;初始化并调用常用表格

 TaxYearForm loTaxYear = new TaxYearForm(); 

     var loTaxProgram = new BaseForm(); 

     if (loTaxYear.ShowDialog() == DialogResult.OK) 
     { 
      string lsTaxModule = loTaxYear.gsTaxModule.ToUpper(); 
      int lnTaxYear = loTaxYear.gnPrimaryFilter; 

      switch (lsTaxModule) 
      { 
       case "RE": 
        RealEstateForm loTaxProgram = new RealEstateForm(); 

        break; 
       case "PC": 
        PerCapitaForm loTaxProgram = new PerCapitaForm(); 

        break; 

      } 

      loTaxProgram.gsUserId = gsUserId; 
      loTaxProgram.gnPrimaryFilter = lnTaxYear; 
      loTaxProgram.gnSecurityLevel = gnSecurityLevel; 

      loTaxProgram.ShowDialog(); 

我不能这样做,因为在switch语句中,我重新使用了变量loTaxProgram。我可以将所有代码放入每个case语句中,但这是我想要避免的。我在类中创建了一个方法,但是由于我不得不声明参数为BaseForm,所以出现了同样的问题。

回答

2

我建议建立一个新的工厂类来创建窗体:

public class FormFactory 
{ 
    public BaseFrom Create(string taxCode) 
    { 
     switch (taxCode) 
     { 
      case "RE": 
       return new RealEstateForm(); 

       // rest of stuff. 
     } 
    } 
} 

所以,你的代码看起来是这样的:

if (loTaxYear.ShowDialog() == DialogResult.OK) 
{  
    var factory = new FormFactory(); 

    var loTaxProgram = factory.Create(loTaxYear.gsTaxModule.ToUpper()); 

    loTaxProgram.gsUserId = gsUserId; 
    loTaxProgram.gnPrimaryFilter = loTaxYear.gnPrimaryFilter; 
    loTaxProgram.gnSecurityLevel = gnSecurityLevel; 

    loTaxProgram.ShowDialog(); 
} 

所以这将是工厂类的责任创造一个形式,使事情变得更加清洁。

1

有进一步重新申报

switch (lsTaxModule) 
{ 
    case "RE": 
    loTaxProgram = new RealEstateForm(); 

    break; 
    case "PC": 
    loTaxProgram = new PerCapitaForm(); 

    break; 
} 
1

无需如果同时你的形式从您的基本形式获得,然后再次声明不要你loTaxProgram变量。

 TaxYearForm loTaxYear = new TaxYearForm(); 

     BaseFrom loTaxProgram; 

     if (loTaxYear.ShowDialog() == DialogResult.OK) 
     { 
      string lsTaxModule = loTaxYear.gsTaxModule.ToUpper(); 
      int lnTaxYear = loTaxYear.gnPrimaryFilter; 

      switch (lsTaxModule) 
      { 
       case "RE": 
        loTaxProgram = new RealEstateForm(); 

        break; 
       case "PC": 
        loTaxProgram = new PerCapitaForm(); 

        break; 

      } 

      loTaxProgram.gsUserId = gsUserId; 
      loTaxProgram.gnPrimaryFilter = lnTaxYear; 
      loTaxProgram.gnSecurityLevel = gnSecurityLevel; 

      loTaxProgram.ShowDialog(); 
+0

就是这样。谢谢。 – ggrewe1959 2012-08-10 13:28:21

1

最快的方法是做这个(注意case语句的变化):

TaxYearForm loTaxYear = new TaxYearForm(); 

    var loTaxProgram = new BaseForm(); 

    if (loTaxYear.ShowDialog() == DialogResult.OK) 
    { 
     string lsTaxModule = loTaxYear.gsTaxModule.ToUpper(); 
     int lnTaxYear = loTaxYear.gnPrimaryFilter; 

     switch (lsTaxModule) 
     { 
      case "RE": 
       loTaxProgram = new RealEstateForm(); 

       break; 
      case "PC": 
       loTaxProgram = new PerCapitaForm(); 

       break; 

     } 

     loTaxProgram.gsUserId = gsUserId; 
     loTaxProgram.gnPrimaryFilter = lnTaxYear; 
     loTaxProgram.gnSecurityLevel = gnSecurityLevel; 

     loTaxProgram.ShowDialog(); 

以供将来参考,您可能希望谷歌这将适应这种工厂模式代码相当漂亮IMO。

+0

就是这样。谢谢! – ggrewe1959 2012-08-10 13:29:09