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()是更好的解决方案