反射子系统的文档说您不能依赖返回元素的顺序。
也就是说,根据我的经验,元素是按照源文件中的声明顺序返回的。在 Mono 或 .NET 的未来版本中,这可能是真的,也可能不是。
尽管有上述情况,如果您希望继续,您最好的选择是使用该BindingFlags.DeclaredOnly
选项并手动遍历继承层次结构(在子类型之前扫描基本类型以使它们以正确的顺序排列)。您应该以这样一种方式编写代码,即单个声明类型的属性排序无关紧要(例如,按名称排序);如果 .NET 框架的行为发生变化,这将使您的代码更加健壮。
Fasterflect这样做(主要是为了能够过滤掉已被覆盖的虚拟属性)。它还具有帮助器来获取属性,无论是否过滤,使用它自己的和更强大的Flags
选择器参数。
如果单个类型中元素的顺序不重要,您可以像这样获得列表(使用 Fasterflect):
var properties = type.Properties().Reverse().ToList();
您应该知道,当以这种方式反映时(通过遍历并仅获取声明的属性),将包含多次覆盖的属性。Fasterflect 提供了从结果中过滤这些的选项:
var properties = type.Properties( Flags.InstancePublic | Flags.ExcludeBackingMembers ).Reverse().ToList();
如果您不想依赖该库,代码是开源的,因此您可以选择您需要的部分。可以在这里看到遍历算法(第 443 行)。