如何显示结构体的字段?

4

我创建了一个结构体:

public struct User {
   public string name;
   public string email;
   public string age;
}

然后创建一个:
 User user = new User();
 user.name = "Freewind";
 user.email = "abc@test.com";
 user.age = 100;

然后展示它:
MessageBox.Show(user.ToString());

我希望能打印出用户结构体的所有字段,但实际上并没有。它只显示了:
MyApp.User

有没有一种简单的方法来显示结构体的所有字段?
3个回答

11

重写你的结构体的 ToString 方法:

public override string ToString()
{
    return String.Format("name={0}, email={1}, age={2}", this.name, this.email, this.age);
}

请注意,这不是自动的,您需要手动将任何字段或属性添加到字符串中。

使用反射,您可以像这样操作:

public override string ToString()
{
    Type type = this.GetType();
    FieldInfo[] fields = type.GetFields();
    PropertyInfo[] properties = type.GetProperties();
    User user = this;

    Dictionary<string, object> values = new Dictionary<string, object>();
    Array.ForEach(fields, (field) => values.Add(field.Name, field.GetValue(user)));
    Array.ForEach(properties, (property) =>
        {
            if (property.CanRead)
                values.Add(property.Name, property.GetValue(user, null));
        });

    return String.Join(", ", values);
}

我们可以使用反射来创建一个通用的工具吗? - Freewind
1
如果你使用的是R#,在结构体名称上按下 alt+insert,选择“格式化成员”,则该代码将会自动生成。 - Luke Hutton
@Freewind 使用反射添加了代码片段。 - SomeWritesReserved
当然,解决方案不是在 ToString 覆盖中使用反射(丑陋!)。解决方案是再次在派生类型中覆盖 ToString - Tergiver

0
使用反射并循环遍历所有属性,如下所示: var sourceProperties = typeof(User).GetProperties();
  foreach (PropertyInfo sourceProperty in sourceProperties)
  {
    MessageBox.Show( sourceProperty.Name );
    MessageBox.Show( sourceProperty.GetValue( user, null, null ) );
  }

希望这有所帮助。


只是为了演示,您可以将字符串连接到字符串构建器中,并仅显示一个框。 - ASR
1
如果他只想显示值,那么重写 ToString() 方法是更好的解决方案。 - ASR

0

显示结构体的内容非常容易,在初始化结构体之后,您只需要确保指定要显示新“User”对象中的哪个变量即可。这可以通过在新“User”对象名称后添加句点来完成,如下所示:

MessageBox.Show(user.name);

这将显示“用户”对象的名称。通过将“名称”替换为“电子邮件”或“年龄”,可以轻松地使用任何其他用户对象变量来完成此操作。顺便说一下,通常最好将像年龄(或任何数字)这样的东西存储在“int”或“byte”中,因为这样可以更轻松地更改值,而不是尝试将数字存储在字符串中。以下是一个例子:
public struct User {
    public string name;
    public string email;
    public int age;
}

or

public struct User {
    public string name;
    public string email;
    //use a byte to hold a value between 0 and 255 (most people don't live to be 255)
    public byte age;
}

并且在尝试显示此变量时,只需在变量名称后面使用 "ToString()",就像这样:
MessageBox.Show(user.age.ToString());

这将把int或byte转换为字符串,以便在“MessageBox.Show”方法中使用。希望这有所帮助!

编辑: 当尝试显示结构体中的所有变量时,只需执行以下操作:

MessageBox.Show("Name: " + user.name + Environment.NewLine + "Email: " + user.email + Environment.NewLine + "Age: " + user.age + Environment.NewLine);

这将显示:

Name: FreeWind
Email: abc@test.com
Age: 100

在消息框内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接