Visual C#-访问在一个类中创建的对象在另一个类中的实例

Visual C#-访问在一个类中创建的对象在另一个类中的实例,c#,instance-variables,C#,Instance Variables,我提前表示歉意,根据范围,这可能是一个相当简单/快速的答案,但我已经到处找了,很惊讶没有找到答案 我创建了一个名为Soldier的类,其中包含大约100个类变量。我需要一个用户输入信息,并在几个不同的类表单中逐步构建一个Solider对象(因为一个表单上收集的数据太多) 我在Form1.cs中创建了一个士兵(tempsolider)的(空)实例,并开始设置我从用户那里收集的对象的类变量 private void button1_Click(object sender, EventArgs e)

我提前表示歉意,根据范围,这可能是一个相当简单/快速的答案,但我已经到处找了,很惊讶没有找到答案

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

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

private void button1_Click(object sender, EventArgs e)
{
    Soldier tempSoldier = new Soldier();
    tempSoldier.surname = textbox1.text;
}
我的问题:如何从其他类(Form2.cs、Form3.cs…)中的Form1.cs访问对象实例(tempsolider)

我应该提到的是,所有表单(Form1.cs、Form2.cs…)都共享相同的名称空间

提前谢谢

编辑:下面所有的解决方案都有效,所以这取决于你最喜欢哪一个。谢谢你的反馈。
需要注意的是,确保所有的类修饰符都是公共的,包括自定义类(在我的例子中是Soldier.cs)。

您需要在更高的范围内声明
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;
}

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

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

// ...

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 static Soldier soldier {get;set;}
private void button1_Click(object sender, EventArgs e)
{
    soldier = new Soldier();
    soldier.surname = textbox1.text;
}
其他形式的代码:

Form1.soldier.name ="";

在另一个类中,创建一个以对象为参数的方法

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);

您的本地声明将有一个非常短的生命周期。如果您在表单中声明了它而不是表单中的方法,您可以在其他地方将其称为
Form1.tempsolider
。我尝试了第一种解决方案,但在尝试添加参数时,Form2构造函数出现了一个奇怪的错误(不一致的可访问性…)(不确定原因,因为它看起来非常符合逻辑)。第二个解决方案是最简单/最干净的,它工作得很好。如果内存可用,您只需要确保表单的类和士兵的类具有相同的可访问性。两者都列为Public,我仍然会收到相同的错误?愚蠢的错误…当我声明士兵类{…}时,我忘记添加Public修饰符(忘记默认情况下它被设置为Private)。这是一个很好的示例,是我发现的最好的示例之一。但是,如果您试图在焊料实例中填充成员,则它不能是只读的。您需要删除只读修饰符才能对实例进行更改,但不确定McGarnagle为什么选择将其放在其中。这似乎是最优雅的解决方案。我收到了相同的错误消息ge作为前面的答案:“不一致的可访问性:属性类型比属性更难访问”第一行:public Soldier Soldier{get;private set;}我知道这与修饰符有关,但每个修饰符都列为public,但错误仍然是哑错误…当我声明Soldier类{…}我忘了添加Public修饰符(忘了默认情况下它被设置为Private)。