获取预制结构的所有值?C#

本文关键字:结构 获取 | 更新日期: 2023-09-27 18:20:19

在C#中,我有一个非常巨大的结构,我想轻松地遍历它,而不是手动键入它们。

我尝试使用:

Type structType = typeof(myStruct);
System.Reflection.FieldInfo[] fields = structType.GetFields();
for(int i=0; i<fields.Length-1; i++)
{
    richTextBox1.Text += fields[i].Name + "'n";
}

其中myStruct是一个巨大的结构,但不能将变量结构传递给它,只能将结构本身传递给它。

基本上我想做的是:

public struct myStruct
{
    public string myName;
    public int myAge;
    ...
    ...
}
//in code
myStruct a = readStructFromFile( filename );
string text = "";
foreach(field in a)
{
    text += field.name + ": " + file.value;
}

这可能吗?

获取预制结构的所有值?C#

使用FieldInfo.GetValue。更大的结构实际上应该是类,因为结构本来就是小的。

myStruct a = readStructFromFile( filename );
Type structType = typeof(myStruct);
System.Reflection.FieldInfo[] fields = structType.GetFields();
var builder = new StringBuilder();
foreach(var field in fields)
{
    builder.Append(string.Format("{0} {1}'n",
                                 field.Name,
                                 field.GetValue(a).ToString());
}
richTextBox1.Text += builder.ToString();

我的建议是编写一些简单的代码生成例程,以生成与您想要的代码接近的东西,并将其复制到剪贴板。然后把它粘贴到你的程序中,做任何需要的小调整。

必须编写大量的样板代码通常意味着你正在做的事情或你使用的语言/框架存在设计缺陷。根据你正在做的事情,错误可能在前者,也可能在后者。

在某些情况下,大型结构是合适的;如果某种类型的每个变量都应该封装一个固定的独立值集合,那么一个公开的字段结构就完美地表达了这一点。在事情开始变得如此之大以至于产生堆栈溢出的风险之前,与20字段类相比,20字段结构更有利于使用4字段结构而不是4字段类的因素将更加重要。

用结构编程和用类编程之间有一些明显的区别。如果使用不可变的类,那么从类实例生成一个除了几个字段之外完全相同的新实例是困难的。如果使用可变类,则很难确保每个变量都封装自己的一组独立值。假设有一个List<classWithPropertyX> myList,而myList[0]持有一个实例,其中X是3。希望myList[0]保持X为4的实例,但不影响与任何其他变量或类型为classWithPropertyX的存储位置相关联的X属性的值。

正确的方法可能是

myList[0].X = 4;

但这可能会产生不必要的副作用。也许需要使用

myList[0] = myList[0].WithX(4);

或者

var temp = myList[0];
myList[0] = new classWithPropertyX(temp.this, 4, temp.that, temp.theOther, etc.);

人们可能需要检查大量的代码来确定哪种技术是合适的。相比之下,如果一个人有List<structWithExposedFieldX> myList,正确的代码是:

var temp = myList[0];
temp.X = 4;
myList[0] = temp;

唯一需要知道的正确方法是structWithExposedFieldX是一个具有公开公共字段X的结构。