C# 如何显示结构的字段?

C# 如何显示结构的字段?,c#,debugging,struct,C#,Debugging,Struct,我创建了一个结构: 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());

我创建了一个结构:

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

有没有一种简单的方法可以显示结构的所有字段?

覆盖结构上的
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);
}
MessageBox.Show(user.name);
MessageBox.Show(user.age.ToString());
public重写字符串ToString()
{
Type Type=this.GetType();
FieldInfo[]fields=type.GetFields();
PropertyInfo[]properties=type.GetProperties();
用户=这个;
字典值=新字典();
Array.ForEach(fields,(field)=>values.Add(field.Name,field.GetValue(user));
Array.ForEach(属性,(属性)=>
{
if(property.CanRead)
Add(property.Name,property.GetValue(user,null));
});
返回字符串。Join(“,”,值);
}

使用反射和循环遍历所有属性,如下所示: var sourceProperties=typeof(User).GetProperties()


希望有帮助。

初始化结构后,显示结构的内容非常容易,只需确保在新的“用户”对象中准确指定要显示的变量即可。这可以通过在新的“用户”对象名称后添加句点来实现,如下所示:

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);
}
MessageBox.Show(user.name);
MessageBox.Show(user.age.ToString());
这将显示“用户”对象的名称。通过将“name”替换为“email”或“age”,可以轻松地使用任何其他用户对象变量完成此操作。顺便说一句,通常最好将年龄(或任何数字)存储在“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()”,如下所示:

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);
}
MessageBox.Show(user.name);
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

在messagebox中。

我们可以使用反射来创建一个通用的util吗?如果你在结构名上有R#,
alt+insert
,选择“格式化成员”,这个代码将自动为你生成。@Freewind添加了使用反射的代码段。当然,解决方案不是在
ToString
覆盖(fugly!)中使用反射。解决方案是(再次)在派生类型中重写
ToString
。只是为了演示您可以直接连接到字符串生成器并只显示一个框。如果他只想显示值,那么重写ToString()是更好的解决方案