GetCustomAttributes()是否保留.NET中的属性顺序?

这个标题几乎说明了一切.当我通过我的类进行一些反思时,MemberInfo.GetCustomAttributes()方法会保留成员的属性顺序吗?官方文件并没有说出任何一种方式.

如果你想知道为什么我需要这个,这里是完整的解释.对于现在提出的问题来说,冗长而不需要这个问题,但是也许有人可以提出一个替代解决方案来解决更大的问题,这不是依赖于属性枚举顺序.

我正在为一个(ASP.NET)应用程序制定一个灵活的框架,预计这个应用程序的使用寿命很长.在这个过程中,它将获得许多必须从菜单中访问的形式.为了使开发人员更轻松,我创建了一个MenuItemAttribute,您可以将其应用于窗体的类.该属性在其构造函数中具有无限量的字符串参数,允许开发人员指定表单在菜单中的何处.典型的使用示例将是[MenuItem(“Company”,“Clients”,“Orders”)],这意味着菜单应该有一个项目“Company”,在该项目下将有一个项目“客户端”会有一个项目“订单” – 然后打开表单.如果需要,单个表单可以具有几个这些属性,然后可以从菜单中的几个位置获得.

显然,整个菜单是通过枚举我的程序集中的所有类并搜索此属性来构建的.但是最近我已经得到了一个请求,即菜单项应该按预定的方式进行排序.具有相关功能的表单应在菜单中彼此相邻.请注意,这不是字母排序,而是开发人员指定的预定义顺序.

这会带来问题 – 如何在这些属性中指定顺序?由于一个MenuItemAttribute描述了一个整体层次结构,订单规范也应包含层次结构的整体(或至少部分)的订单号.只有较低层次的订单号码是不够的.

我可以创建另一个属性 – MenuItemOrderHintAttribute,但是当有多个MenuItemAttribute时,会产生问题.所以原来的问题.

我也可以扩展MenuItemAttribute以获取两个数组或一对数组,但这样会使语法复杂化.最后一个想法是,我可以使字符串具有特殊的格式,但这将是相当凌乱的IMHO.

好的,我有另一个想法.让我们来看看Jon Skeet的建议.这将允许指定层次结构的最后一个级别的顺序,而不是较高层次的顺序.但是我可以修改属性,使其不仅适用于类,还适用于程序集本身.在这种情况下,菜单项不会有关联的窗体.在汇编级别,这些属性可以用于指定层次结构的较高级别之间的排序.

这就是集中式和分散式菜单系统之间的折衷.任何想法,为什么这将是一个坏主意?

我会在MenuItemAttribute构造函数中放置一个额外的(可选)值,即“order”或“priority”:

[MenuItem(0, "Company", "Clients", "Orders")]
[MenuItem(1, "Foo", "Bar", "Baz")]

我不是说它会漂亮,但它会有效地让你指定订购.

相关文章
相关标签/搜索