假设我们有一个结构体:
Struct myStruct
{
int var1;
int var2;
string var3;
.
.
}
是否可以通过foreach循环遍历结构体的成员变量呢?我已经阅读了一些关于反射的内容,但是不确定如何在这里应用。
结构体中有大约20个变量。我正在尝试从文件中读取值,并尝试将它们分配给变量,但不想调用20次file.ReadLine()。我正在尝试通过循环访问成员变量。
假设我们有一个结构体:
Struct myStruct
{
int var1;
int var2;
string var3;
.
.
}
是否可以通过foreach循环遍历结构体的成员变量呢?我已经阅读了一些关于反射的内容,但是不确定如何在这里应用。
结构体中有大约20个变量。我正在尝试从文件中读取值,并尝试将它们分配给变量,但不想调用20次file.ReadLine()。我正在尝试通过循环访问成员变量。
您可以与正常情况下一样使用Type.GetFields
来应用反射:
MyStruct structValue = new MyStruct(...);
foreach (var field in typeof(MyStruct).GetFields(BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public))
{
Console.WriteLine("{0} = {1}", field.Name, field.GetValue(structValue));
}
请注意,如果该结构体公开了属性(几乎肯定会这样),您可以使用Type.GetProperties
获取这些属性。
(正如评论中所指出的那样,在第一次尝试这样做时可能并不是一个好主意,“总的来说”,我对用户定义的结构体持怀疑态度,但我还是想包含实际答案……)
编辑:现在似乎您对“设置”字段感兴趣,由于值类型的工作方式(是的,这个结构体真的不应该存在),这会稍微复杂一些。您需要进行装箱(box)操作,然后对单个装箱实例上的值进行设置,最后再取消装箱(unbox):
object boxed = new MyStruct();
// Call FieldInfo.SetValue(boxed, newValue) etc
MyStruct unboxed = (MyStruct) boxed;