我希望能够在C#(.Net 2.0)中迭代结构的值。这将在运行时完成,不知道结构中可能的值。
我正在考虑使用Reflection将结构值添加到列表中,或者将结构转换为实现IEnumerable接口的数据结构。任何人都可以提供任何指示吗?
提前感谢您的帮助。
此致 安迪。
答案 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
文档。