Фабричная модель в C # и без использования конструктора по умолчанию - PullRequest
0 голосов
/ 11 февраля 2009

Я использовал фабричную модель для создания дочерних форм для добавления в форму MDI. Это код, который я использовал:

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

Однако возникла ситуация, когда мне нужно добавить целочисленный параметр в конструктор определенной формы. Как я могу изменить это и заставить это отражать это, все еще поддерживая образец в его текущей легкости использования (или почти).

1 Ответ

5 голосов
/ 11 февраля 2009

Вы можете добавить параметр 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, который будет удовлетворять конструктору, отличному от заданного по умолчанию.

...