2009-02-11 57 views
0

我一直在使用工廠模型來創建子窗體添加到MDI窗體。這是我一直在使用的代碼:C#中的工廠模型,而不使用默認的構造函數

/// <summary> 
    /// This uses the Factory Model to create the child node and then add it to the MDI Parent (this) 
    /// </summary> 
    /// <param name="childName">String class name of the child, i.e. RentalEase.PropertyGrid must extend Form or SingleInstance</param> 
    /// <param name="singleInstance">bool If this class is to be a single instance and restricted to only on instance. Must extend SingleInstance</param> 
    public void createChild(string childName, bool singleInstance) { 
     if (singleInstance) { 
      try { 
       BaseAndSingleInstanceForm f = BaseAndSingleInstanceForm.getInstanceByType(this, Type.GetType(childName)); 
        f.MdiParent = this; 
        f.Show(); 
        f.BringToFront(); 
        this.Refresh(); 
      } catch (Exception ex) { 
       MessageBox.Show("Could not create child: " + ex.ToString()); 
      } 
     } else { 
      try { 
       object o = Activator.CreateInstance(Type.GetType(childName)); 
       if (o is Form) { 
        Form f = (Form)o; 
        f.MdiParent = this; 
        f.Show(); 
        f.BringToFront(); 
        this.Refresh(); 
       } else { 
        throw new ArgumentException("Invalid Class"); 
       } 
      } catch (Exception ex) { 
       MessageBox.Show("Could not create child: " + ex.ToString()); 
      } 
     } 
    } 

然而,情況已經出現了,我有一個整數參數添加到特定形式的構造函數。我怎樣才能改變這一點,並使其反映出來,同時仍然保持目前易用性(或接近)的模式。

回答

5

您可以將一個Object[]參數添加到方法中,該方法將表示您希望實例化的對象的構造函數的參數。然後,當您撥打Activator.CreateInstance時,您可以將該數組傳入,並且Activator將盡最大努力在您指定的類型上找到與Object數組中的類型匹配的構造函數。

這裏是我的意思更簡化的例子:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = (Foo)create("Foo", new Object[] { }); 
     Bar bar = (Bar)create("Bar", new Object[] { "hello bar" }); 
     Baz baz = (Baz)create("Baz", new Object[] { 2, "hello baz" }); 
    } 

    static Object create(String typeName, Object[] parameters) 
    { 
     return Activator.CreateInstance(Type.GetType(typeName), parameters); 
    } 
} 

class Foo 
{ 
    public Foo() { } 
} 

class Bar 
{ 
    public Bar(String param1) { } 
} 

class Baz 
{ 
    public Baz(Int32 param1, String param2) { } 
} 

我們有三種類型都有不同的構造 - 如果調用方負責類型名稱發送那麼他們也將負責提供一個滿足非默認構造函數的數組Objects

相關問題