0

我有这门课(取自网络):

class SingletonFormProvider
{
    static Dictionary<Type, Form> mTypeFormLookup = new Dictionary<Type, Form>();

    static public T GetInstance<T>(Form owner)
        where T : Form
    {
        return GetInstance<T>(owner, null);
    }

    static public T GetInstance<T>(Form owner, params object[] args)
        where T : Form
    {
        if (!mTypeFormLookup.ContainsKey(typeof(T)))
        {
            Form f = (Form)Activator.CreateInstance(typeof(T), args);
            mTypeFormLookup.Add(typeof(T), f);
            f.Owner = owner;
            f.FormClosed += new FormClosedEventHandler(remover);
        }
        return (T)mTypeFormLookup[typeof(T)];
    }

    static void remover(object sender, FormClosedEventArgs e)
    {
        Form f = sender as Form;
        if (f == null) return;

        f.FormClosed -= new FormClosedEventHandler(remover);
        mTypeFormLookup.Remove(f.GetType());
    }
}

如果使用标准打开,我知道如何传递参数:

        Form f = new NewForm(parameter);
        f.Show();

但我正在使用这种打开新表单的方式(在上述课程的帮助下):

        var f = SingletonFormProvider.GetInstance<NewForm>(this);
        f.Show();

那么,如何通过这种打开新表单的方式传递参数呢?

请帮忙。

谢谢。

4

2 回答 2

1

GetInstance<T>方法最后有一个params object[]参数。它本质上是说你可以继续给它参数,它们会被放入一个object[]for you。

该方法在调用 时,会将Activator.CreateInstance这些参数传递给表单的构造函数。

不幸的是,您的参数只会在第一次创建时传递给该子表单,而不是每次显示表单时,因为正在创建的表单与它们的类型相比是缓存的。如果您需要在显示子表单时为其设置一些值,我建议Initialize在该表单上创建一个接受您需要设置的参数的方法。

例子

public class NewForm : Form
{
    ...

    public NewForm(string constructorMessage)
    {
        //Shows the message "Constructing!!!" once and only once, this method will 
        //never be called again by GetInstance
        MessageBox.Show(constructorMessage);
    }

    public void Initialize(string message)
    {
        //Shows the message box every time, with whatever values you provide
        MessageBox.Show(message);
    }
}

像这样称呼它

var f = SingletonInstanceProvider.GetInstance<NewForm>(this, "Constructing!!!");
f.Initialize("Hi there!");
f.Show();
于 2013-10-08T08:03:44.587 回答
0

请参考A Generic Singleton Form Provider for C#。你可能会从中得到帮助。

于 2013-10-08T08:06:21.060 回答