使用反射按声明顺序获取属性

我需要按照在类中声明它们的顺序使用反射来获取所有属性。根据MSDN,使用时无法保证顺序GetProperties()


GetProperties方法不按特定顺序(例如字母顺序或声明顺序)返回属性。


但是我读过,有一种解决方法,可以通过排序属性MetadataToken。所以我的问题是,这样安全吗?我似乎找不到有关MSDN的任何信息。还是有其他解决方法?


我当前的实现如下所示:


var props = typeof(T)

   .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

   .OrderBy(x => x.MetadataToken);


绝地无双
浏览 275回答 2
2回答

ABOUTYOU

根据MSDN, MetadataToken一个模块内部是唯一的-没什么可说的是它可以保证任何订单。即使它确实按照您希望的方式运行,也将是特定于实现的,并且随时可能更改,恕不另行通知。请参阅此旧的MSDN博客条目。我强烈建议您不要依赖任何此类实现细节-请参阅Marc Gravell的回答。如果您在编译时需要一些东西,可以看一下Roslyn(尽管它还处于早期阶段)。

POPMUISE

如果要使用属性路由,这是我过去使用的方法;public static IOrderedEnumerable<PropertyInfo> GetSortedProperties<T>(){&nbsp; return typeof(T)&nbsp; &nbsp; .GetProperties()&nbsp; &nbsp; .OrderBy(p => ((Order)p.GetCustomAttributes(typeof(Order), false)[0]).Order);}然后像这样使用它;var test = new TestRecord { A = 1, B = 2, C = 3 };foreach (var prop in GetSortedProperties<TestRecord>()){&nbsp; &nbsp; Console.WriteLine(prop.GetValue(test, null));}哪里;class TestRecord{&nbsp; &nbsp; [Order(1)]&nbsp; &nbsp; public int A { get; set; }&nbsp; &nbsp; [Order(2)]&nbsp; &nbsp; public int B { get; set; }&nbsp; &nbsp; [Order(3)]&nbsp; &nbsp; public int C { get; set; }}如果您在所有属性上都没有可比较属性的类型上运行该方法,则该方法将受到禁止,因此请小心使用它的方式,它应足以满足要求。我省略了Order:Attribute的定义,因为Yahia到Marc Gravell的帖子的链接中有一个很好的示例。
打开App,查看更多内容
随时随地看视频慕课网APP