【问题标题】:Visual C# - Access instance of object created in one class in anotherVisual C# - 访问在另一个类中创建的对象的实例
【发布时间】:2012-09-02 09:19:50
【问题描述】:

我提前道歉,根据范围,这可能是一个相当简单/快速的答案,但我到处寻找,很惊讶没有找到答案。

我创建了一个名为 Soldier 的类,其中包含大约 100 个类变量。我需要用户输入信息并在几个不同的类 Forms 的过程中逐步构建一个 Solider 对象(因为要收集的数据太多了)。

我在 Form1.cs 中创建了一个士兵 (tempSoldier) 的(空)实例,并开始设置我从用户那里收集的对象的类变量。

private void button1_Click(object sender, EventArgs e)
{
    Soldier tempSoldier = new Soldier();
    tempSoldier.surname = textbox1.text;
}

我的问题:如何从其他类(Form2.cs、Form3.cs ...)中的 Form1.cs 访问对象实例(tempSoldier)?

我应该提到所有表单(Form1.cs、Form2.cs ...)共享相同的命名空间。

提前致谢

编辑:下面的所有解决方案都有效,所以它只取决于你最喜欢哪一个。感谢您的反馈意见。 一点小提示,确保将所有类修饰符设为公开,包括您的自定义类(在我的例子中是 Soldier.cs)。

【问题讨论】:

  • 您的本地声明将有一个非常短暂的生命周期。如果您在表单中声明它而不是表单中的方法,则可以在其他地方将其称为Form1.tempSoldier

标签: c# instance-variables


【解决方案1】:

您需要在更高的范围内声明Soldier 实例。

这样做的一种方法是在 Form1 中声明它,然后将其传递给 Form2,依此类推。

public class Form1
{
    private Soldier tempSoldier = new Soldier();

    private void button1_Click(object sender, EventArgs e)
    {
        tempSoldier = new Soldier();
        tempSoldier.surname = textbox1.text;
    }

    private void GotoNextStep()
    {
        // pass the existing instance to the next form
        Form2 form2 = new Form2(tempSoldier);

        // display form 2 ...
    }
}

另一种可能性是在所有表单都可以访问的类中使用单例变量。

public class MyAppManager
{
    private static readonly Soldier _soldier = new Solider();

    public static Soldier SoldierInstance
    {
        get { return _soldier; }
    }
}

private void button1_Click(object sender, EventArgs e)
{
    MyAppManager.SoldierInstnace.surname = textbox1.text;
}

如果表格有不同的顺序,前一种方法是可以的;如果可以在不同时间使用或重新访问不同的表格,则后者会更好。

【讨论】:

  • 我尝试了第一个解决方案,但是当我尝试添加参数时,Form2 构造函数出现了一个奇怪的错误(可访问性不一致...)(不知道为什么,因为它看起来很合乎逻辑)。第二种解决方案是最简单/最干净的,而且效果很好。
  • 如果没记错的话,您只需要确保表单的类和 Soldier 的类具有相同的可访问性。
  • 两者都被列为公开,我仍然遇到同样的错误?
  • 愚蠢的错误...当我声明 Soldier 类时{...}我忘记添加 Public 修饰符(忘记默认设置为 Private)。
  • 这是一个很好的例子,是我找到的最好的例子之一。但是,如果您尝试在 Solder 实例中填充成员,则它不能是只读的。您需要删除只读修饰符才能对实例进行更改,但不确定 McGarnagle 为何选择将其放入其中。
【解决方案2】:

您应该在表单上创建一个公开该士兵的公共属性。然后,您可以从其他表单访问此属性。

// ...

public Soldier Soldier { get; private set; }

private void button1_Click(object sender, EventArgs e)
{
  Soldier tempSoldier = new Soldier();
  tempSoldier.surname = textbox1.Text;

  this.Soldier = tempSoldier;
}

// ...

您的 Form2 类可能如下所示:

public partial class Form2
{
  private Form1 form1;

  public Form2(Form1 form1)
  {
    this.form1 = form1;

    this.InitializeComponent();
  }

  public void DoStuffWithForm1()
  {
    // ...

    string surname = this.form1.Soldier.surname;

    // ...
  }
}

【讨论】:

  • 我收到与上一个答案相同的错误消息:“不一致的可访问性:属性类型比属性更难访问”第一行:public Soldier Soldier { get;私人套装;我知道这与修饰符有关,但每个修饰符都被列为公共,但错误仍然存​​在
  • 愚蠢的错误...当我声明 Soldier 类时{...}我忘记添加 Public 修饰符(忘记了默认设置为 Private)。
【解决方案3】:

您也可以将 Soldier 设为静态变量:

public static Soldier soldier {get;set;}
private void button1_Click(object sender, EventArgs e)
{
    soldier = new Soldier();
    soldier.surname = textbox1.text;
}

其他形式的代码:

Form1.soldier.name ="";

【讨论】:

  • 这似乎是最优雅的解决方案。
【解决方案4】:

在您的其他类中,创建一个以对象为参数的方法。

public class TryMe (TextBox newTextbox) {
newTextbox.Text = "Hello this is a text."
//You can also get the value of textbox of another form
var textString = newTextbox.Text;
}

然后在您的主窗体中,使用您的对象作为参数调用该方法。在这种情况下,请将 textbox1 添加到方法的参数中。

您的代码格式:

TryMe(textbox1);

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多