gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:20:34 27 4
gpt4 key购买 nike

标题基本概括了所有内容。当我通过我的类进行一些反射时, MemberInfo.GetCustomAttributes() 方法是否会保留成员上的属性顺序?官方文档没有以任何方式说明任何内容。

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

我正在尝试为预计具有相当长生命周期的 (ASP.NET) 应用程序制作一个灵活的框架。在类(class)中,它将获得许多必须从菜单访问的表格。为了让开发人员的生活更轻松,我制作了一个 MenuItemAttribute您可以将其应用于表单的类。此属性在其构造函数中具有无限数量的字符串参数,允许开发人员指定表单在菜单中的确切位置。典型的用法示例类似于 [MenuItem("Company", "Clients", "Orders")]这意味着菜单应该有一个项目“公司”,在该项目下会有一个项目“客户”,在该项目下会有一个项目“订单” - 然后将打开表单。如果需要,单个表单可以具有多个这些属性 - 然后可以从菜单中的多个位置访问它。

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

这就带来了问题——如何在这些属性中指定顺序?自一个 MenuItemAttribute描述整个层次结构,订单规范还应包括整个(或至少部分)层次结构的订单号。仅用于层次结构较低级别的订单号是不够的。

我可以创建另一个属性 - MenuItemOrderHintAttribute ,但是当存在多个 MenuItemAttribute 时,这会带来问题。 .因此原来的问题。

我也可以扩展 MenuItemAttribute取两个数组或一对数组,但这会使语法复杂化很多。最后一个想法是我可以让字符串具有特殊的格式,但恕我直言,这会相当困惑。

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

这是集中式菜单系统和分散式菜单系统之间的权衡。任何想法为什么这会是一个坏主意?

最佳答案

文件中元素的词法顺序是 绝对不保证在生成的 CIL 程序集中以任何方式持久化,也不保证在从反射返回的结果中得到尊重。甚至不能保证在同一应用程序域内重复调用的顺序是相同的!

请注意,MS 过去在反射的其他部分打破了这种顺序(注意到他们这样做实际上导致了他们的一些代码的一些问题),因此即使它现在碰巧工作,也没有什么可以阻止这种破坏将来或在不同的平台上。

考虑更改您的属性模型以允许直接表达语义信息而不是依赖排序。

关于.net - GetCustomAttributes() 是否保留 .NET 中的属性顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/480007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com