C#按原始顺序获取FieldInfos / PropertyInfos?

如何将类型FieldInfos / PropertyInfos作为MemberInfo数组按照它们在类中的布局顺序获取?

class Test { public bool First { get; set; } public int Second; public string Third { get; set; } } 

http://msdn.microsoft.com/en-us/library/ch9714z3.aspx

GetFields方法不按特定顺序返回字段,例如按字母顺序或声明顺序。 您的代码不得依赖于返回字段的顺序,因为该顺序会有所不同。

http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

GetProperties方法不以特定顺序返回属性,例如按字母顺序或声明顺序。 您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。

您需要自己定义顺序,可能还有属性:

 class Test { [Order(1)] public bool First { get; set; } [Order(2)] public int Second; [Order(3)] public string Third { get; set; } } ... [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = true, AllowMultiple = false)] [ImmutableObject(true)] public sealed class OrderAttribute : Attribute { private readonly int order; public int Order { get { return order; } } public OrderAttribute(int order) {this.order = order;} } 

您不能,因为此信息与类的执行或function无关。 你为什么要检索这个信息呢?

看看Mono.Cecil

如果Serializer能够进行源代码排序,则不会因为PDB调试信息。

我假设reflection失去了排序,因为它(可能)返回直接和inheritance成员的混合。 该混合没有“正确”的排序。

Mono.Cecil将允许您直接访问托管程序集中的结构以及CIL代码。 Mono.cecil摇滚大时间,不会吃你的小狗。 它是分析程序集的最佳方法,您甚至不必加载它们。

如果你愿意,Mono.Cecil继续一个新的集会,但这个宣传正在偏离主题。

去获取Mono.Cecil

行号信息未编译到程序集中,它存储在.PDB文件中以供调试器使用。
虽然从技术上讲,有可能从PDB文件中获取您正在查看的信息,但我认为这也不是一个好主意,因为PDB文件不会出现在生产环境中。 即使它存在,也不能保证它与DLL同步。

我试图以相反的方式谷歌时发现了更多信息。 就像JbEvain指出的那样,确认无法控制编译器在CIL类中输出成员的顺序。 这甚至与XmlSerializer有关

这里发布了许多有趣的post:

在那个主题上,我发现事实上要有可靠的排序(在.NET 2.0中,你也可以使用XmlElementAttribute.Order“显式”控制它)[pluralsight-training.net/community/blogs/tewald/archive/2006/ 04 / ……和其他人

这应该为这次讨论提供良好的背景。 它现在真正取决于原始海报需要这些信息是否甚至可以找到解决方案,如果是,找到实现该目标的途径。