使传递的引用可用于方法

Making passed reference available to methods

目前我正在编写一个向导(使用 MBG SimpleWizard 库)。我有几页。作为在它们之间共享数据的一种方式,它们被传递 class out DBManip DBController。我需要在方法中使用此 DBController,但调用由库处理,因此我无法通过引用该方法轻松传递 DBController。如何将传递的引用变成方法可以修改的 属性,并保留引用。

Class初始化:

    WizardHost host = new WizardHost();
    using (host)
    {
        host.Text = Migration.Properties.Resources.AppName;
        host.ShowFirstButton = false;
        host.ShowLastButton = false;
        host.WizardCompleted += new WizardHost.WizardCompletedEventHandler(this.Host_WizardCompleted);

        DBManip DBController;

        host.WizardPages.Add(1, new Page1());
        host.WizardPages.Add(2, new Page2(out DBController));
        host.WizardPages.Add(3, new Page3(out DBController));
        host.WizardPages.Add(4, new Page4(out DBController));
        host.LoadWizard();
        host.ShowDialog();
    }

构造函数:

 public Page2(out DBManip DBController)
        {
            this.InitializeComponent();
            this.label1.Text = Migration.Properties.Resources.ExportDirectoryMessage;
            this.exportDirTextbox.Text = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        }

方法:

private bool SetExportDirectory ()
{
    string exportDirectory = this.exportDirTextbox.Text;

    // If a path is given, check if it's valid
    // and set the pathExists boolean
    if (!Directory.Exists(exportDirectory))
    {
        MessageBox.Show(Migration.Properties.Resources.InvalidPath);
        return false;
    }

    // Initializing the object to manipulate the databases
    exportDirectory = new DBManip(exportDirectory);
    return true;
}

属性 将调用方法:

public bool PageValid
{
    get { return SetExportDirectory(); }
}

抱歉,如果我遗漏了一些简单的东西,我是 C# 的新手

不清楚您的页面使用 DBManip 做什么,但您需要将其作为使用它的任何页面 class 的 属性。

为此,您通常会在创建页面之前先创建一个 DBManip 实例,然后将其传递给需要它的每个构造函数。每个 classes 都有一个 属性 用于存储引用,以便以后使用。 每个 class 都需要为自己声明 属性,因为你不容易给他们一个共同的基础 class你自己。

但是你稍后再创建它。由于您需要不同的 classes 共享对在其构造函数退出后创建的对象的引用,我们将添加一个快速 "reference" 通用 class,它们将共享一个参考那个。然后我们可以更改它的属性,它们将在这个小 "handle" class 的现有实例上都具有新的 属性 值。

Reference.cs

//  Semantically, this is basically a pointer to a pointer, without the asterisks.
public class Reference<T>
{
    public Reference() { }

    public Reference(T t) { Value = t; }

    public T Value;
}

主要 C#

WizardHost host = new WizardHost();
using (host)
{
    host.Text = Migration.Properties.Resources.AppName;
    host.ShowFirstButton = false;
    host.ShowLastButton = false;
    host.WizardCompleted += new WizardHost.WizardCompletedEventHandler(this.Host_WizardCompleted);

    //  ************************
    //  Create shared "reference" instance
    //  ************************
    Reference<DBManip> dbControllerRef = new Reference<DBManip>();

    host.WizardPages.Add(1, new Page1());
    host.WizardPages.Add(2, new Page2(dbControllerRef));
    host.WizardPages.Add(3, new Page3(dbControllerRef));
    host.WizardPages.Add(4, new Page4(dbControllerRef));
    host.LoadWizard();
    host.ShowDialog();
}

Page2.cs

//  It's not an out parameter so don't make it one. 
public Page2(Reference<DBManip> dbControllerRef)
{
    this.InitializeComponent();

    this.DBControllerRef = dbControllerRef;

    this.label1.Text = 
        Migration.Properties.Resources.ExportDirectoryMessage;
    this.exportDirTextbox.Text = 
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}

public Reference<DBManip> DBControllerRef {
    get; private set;
}

private bool SetExportDirectory ()
{
    string exportDirectory = this.exportDirTextbox.Text;

    // If a path is given, check if it's valid
    // and set the pathExists boolean
    if (!Directory.Exists(exportDirectory))
    {
        MessageBox.Show(Migration.Properties.Resources.InvalidPath);
        return false;
    }

    //  Everybody has the same Refernece<DBManip>
    this.DBControllerRef.Value = new DBManip(exportDirectory);

    return true;
}