- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标题基本概括了所有内容。当我通过我的类进行一些反射时, 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/
我需要能够从类的基类中的方法中检索类的自定义属性。现在,我通过基类中的 protected 静态方法使用以下实现来完成此操作(该类可以应用相同属性的多个实例): //Defined in a 'Bas
我目前有一个功能: public static Attribute GetAttribute(MemberInfo Member, Type AttributeType) { Object[]
我已经定义了一个自定义属性 [AttributeUsage(AttributeTargets.Property )] public class FieldAttribute: Attribute {
在我的解决方案中的 MiddleTier 项目中,我有 Customer 类,其中一个是用 Attribute1 定义的 public class Customer2 { public str
我已经与这个问题斗争了几个小时,但我找不到任何关于 SO(或谷歌)的相关信息。 这是我的问题: 我有一个包含对象数组属性的自定义属性。 [System.AttributeUsage(System.At
我遇到了性能问题,因为我使用反射和 GetCustomAttributes 进行数据访问。性能分析器检测到它。我有这样的扩展方法: public static class DataRowExtensi
我注意到在类 MemberInfo 的包 System.Reflection 中有两种方法(一种类方法和一种扩展方法)具有相同的签名但返回类型不同: 类方法: public abstract obje
有人可以向我解释为什么 Value.GetType().GetCustomAttribute 返回 null 吗?我已经查看了十个不同的教程,了解如何获取枚举类型成员的属性。无论我使用哪种 GetCu
我目前正在努力将 Windows 8.1 通用应用程序升级为 Windows 10 UWP 应用程序。有一部分代码在我的 Windows 10 UWP 应用程序中不再工作之前运行良好。 我有一个看起来
我正在尝试找出从属性中获取自定义属性的最佳方法。我一直在使用 GetCustomAttributes()为此,但我最近读到 GetCustomAttributes() 会导致创建属性的实例,并且 Ge
标题基本概括了所有内容。当我通过我的类进行一些反射时, MemberInfo.GetCustomAttributes() 方法是否会保留成员上的属性顺序?官方文档没有以任何方式说明任何内容。 如果你想
为什么不GetCustomAttributes(true)返回属性 AttributeUsageAttribute.Inherited = false ?在我看到的文档中没有任何内容表明这两者应该相互
MSDN 文档:MemberInfo.GetCustomAttibutes Method (Type, Boolean)备注中指出: This method ignores the inherit p
我有一个 List . TransformationItem只是多个类的基类,例如ExtractTextTransform和 InsertTextTransform 为了使用内置的 XML 序列化和反
我正在向 .NET 应用程序添加“关于”对话框,并且正在查询程序集的属性以获取要显示的信息。当我尝试检索程序集的 AssemblyVersionAttribute 时使用GetCustomAttrib
public enum Animal { [Description("King of jungle")] Lion= 1, [Description("Tallest ther
我正在尝试从类中获取属性,但似乎没有 GetCustomAttributes 方法。 CoreCLR中如何获取属性? using System.Reflection; class FooBar {
我有一些代码来定义自定义属性,然后读入代码,它无法工作。为了尝试解决问题,我返回并尝试使用 DisplayName,但是,我仍然遇到相同的问题 GetCustomAttribute 或 GetCust
考虑这样一种情况,其中一个程序集包含一个或多个具有自定义属性 MyAttribute 的类型,您需要获取这些类型的列表。使用 IsDefined 有什么好处吗?与 GetCustomAttribute
我今天注意到,我的 .NET 4.5 项目的 System.Type 对象的智能感知中出现了一些新属性。其中有一个称为 CustomAttributes。 我对此很感兴趣,因为我之前了解到 GetCu
我是一名优秀的程序员,十分优秀!