1

在 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;
}

那可能吗?

4

2 回答 2

2

使用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();
于 2013-06-27T15:44:10.377 回答
0

我的建议是编写一些简单的代码生成例程来生成与您想要的代码接近的内容并将其复制到剪贴板。然后将其粘贴到您的程序中并进行所需的任何小调整。

必须编写大量样板代码通常意味着在您正在做的事情或您正在使用的语言/框架中存在设计缺陷。取决于您正在做什么,故障可能出在前者或后者。

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

使用结构进行编程与使用类进行编程之间存在一些明显的差异。如果使用不可变类,则很难从一个类实例生成一个除少数字段外相同的新实例。如果使用可变类,则很难确保每个变量都封装了自己的一组独立值。假设一个人有一个List<classWithPropertyX> myList, 并myList[0]持有一个X3 的实例。一个人希望myList[0]持有一个 4 的实例X,但不影响X与任何其他变量或类型的存储位置关联的属性的值classWithPropertyX

正确的方法可能是

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

于 2013-06-27T19:44:57.833 回答