通过结构迭代?

时间:2009-03-19 11:25:46

标签: c# .net

我希望能够在C#(.Net 2.0)中迭代结构的值。这将在运行时完成,不知道结构中可能的值。

我正在考虑使用Reflection将结构值添加到列表中,或者将结构转换为实现IEnumerable接口的数据结构。任何人都可以提供任何指示吗?

提前感谢您的帮助。

此致 安迪。

5 个答案:

答案 0 :(得分:10)

你究竟是什么意思 - 结构中的各个字段?或许属性?如果是这样,Type.GetFields()Type.GetProperties()即可。

顺便说一下,你绝对确定需要使用结构吗?这很少是C#中最好的设计决策,特别是如果结构包含多个值。

编辑:是的,结果似乎是由于遗留原因而使用的结构。

我之前没有提到的一件事:如果struct的字段不公开,则需要指定适当的BindingFlags(例如BindingFlags.Instance | BindingFlags.NonPublic)。

答案 1 :(得分:2)

在最简单的层面上,假设您要迭代属性:

PropertyInfo[] properties = myStructInstance.GetType().GetProperties();
foreach (var property in properties) {
    Console.WriteLine(property.GetValue(myStructInstance, null).ToString());
}

答案 2 :(得分:1)

我使用以下内容:

[StructLayout(LayoutKind.Sequential)]
public struct MY_STRUCT
{
   public uint aa;
   public uint ab;
   public uint ac;
}

MY_STRUCT pMS = new MY_STRUCT();

FieldInfo[] fields = pMS.GetType().GetFields();
foreach (var xInfo in fields)
   Console.WriteLine(xInfo.GetValue(pMS).ToString());

答案 3 :(得分:0)

要使其适用于每个结构,您必须使用反射。如果您要声明具有此功能的一组结构,可以让它们实现IEnumerable<KeyValuePair<string, object>>并将GetEnumerator()定义为:

yield return new KeyValuePair<string, object>("Field1", Field1);
yield return new KeyValuePair<string, object>("Field2", Field2);
// ... and so forth

答案 4 :(得分:0)

有关使用Reflection的示例,请参阅system.reflection.propertyinfo文档。