标题几乎说明了一切。当我通过我的班做了一些反思,将MemberInfo.GetCustomAttributes()方法保存一个部件属性的顺序,还是没有?官方文档不说什么的一种方式或其他。


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

我试图做一个灵活的框架,该框架预计将有一个相当长寿命的(ASP.NET)应用程序。在当然,这将获得将必须从菜单访问多种形式。为了让生活更容易为开发商来我做了,你可以将一个窗体的类MenuItemAttribute。该属性的字符串参数的构造函数中的无限量,它允许开发人员指定究竟会的形式驻留在菜单中。一个典型的使用例子是像[MenuItem("Company", "Clients", "Orders")]那么这将意味着菜单应具有其下会有一个项目“客户”其下会有一个项目“订单”的项目“公司” - 那么这将打开窗体。单个形式可以有几个这些属性如果需要的话 - 则它将是从在菜单的几个地方acessible

显然整个菜单是通过在我的程序集的所有类枚举和搜索此属性内置的运行时间。不过最近我已经得到了这些菜单项应预先定义的方式进行排序的请求。具有相关功能的形式应该是在菜单中彼此相邻。请注意,这不是字母排序的,但预定的顺序,开发商指定。

这则带来的问题 - 我该如何指定这些属性的顺序?由于一个MenuItemAttribute描述了一种整体的层次结构,所述顺序指定还应包括层次结构的整个顺序号码(或至少一部分)。对于刚刚所述层级的较低级的顺序号是不充分的。

我能把另一个属性 - MenuItemOrderHintAttribute,但随后,将带来案件的问题时,有不止一个MenuItemAttribute。因此,原来的问题。

我还可以扩展MenuItemAttribute采取任何两个阵列或双阵列,但然后将复杂的语法很多。最后的想法是,我可以使字符串具有特殊的格式,但是这将是相当混乱恕我直言。


OK,我已经得到了另一种思路。让我们使用乔恩斯基特建议的顺序。这将允许指定层次结构的最后一个级别,而不是更高的人的顺序。但是,使其不仅适用于类,但也给大会本身,我可以修改属性。在这种情况下,菜单项不会有关联的形式。在组件级别这些属性可以然后被用来指定较高层次中的排序。

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

有帮助吗?

解决方案

我把一个额外的(可选)值在MenuItemAttribute构造函数,它是“顺序”或“优先级”:

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

我并不是说这将是很漂亮,但它会有效地允许您指定的顺序。

其他提示

元素的在文件中的词汇顺序是的绝对不能保证在无论如何被保留在所得的CIL组件也不在结果得到尊重从反射返回。这种排序甚至没有保证是同在相同的应用程序域内千呼万唤!

请注意,MS在过去(注意,因为他们做到了,这实际上造成了一些自己的代码中的一些问题),打破了这种排序反射的其他部分,因此即使它发生在一瞬间的工作有什么停止该断裂在未来或在不同平台上。

考虑改变你的属性模型,使表达的语义信息,而不是直接依靠排序。

不幸的是,不,你不能保证的顺序指定的顺序是一样的。

编辑:一种变通方法

免责声明:我很抱歉提前如果我误解你的终极问题

听起来好像你需要能够传递一个字符串nMenuItemAttribute并有MenuItemAttribute维护这些字符串的顺序是由属性构造开发商进入。

下面是一种可能的解决方案:

MenuItemAttribute使用 LinkedList<String> 以维持其状态。然后你就可以迭代params String[]在构造函数,并把它们添加到其将维持秩序的LinkedList<String>

在我看来,你的问题真正从事实形式规定,他们出现在你的菜单,这意味着你正在尝试通过所有形式的组件相结合,建立一个菜单茎。如果从任何形式分别指定菜单的结构,并解决从对应于菜单项的类中定义的各种化子性质/属性的形式可能是更容易。

e.g。

public class MenuItem
{
    string Text { get; }
    Type FormType { get; }
    ICollection<MenuItem> SubItems { get; }
}

然后,当选择了菜单项目时,以某种方式解决的形式并显示它。这种方法的缺点是,任何新形式的需要需要改变的代码指定与形式本身沿着菜单结构,但是这将是相当小的...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top