【问题标题】:Why would one want to use AttributeUsage AllowMultiple when creating attributes?为什么要在创建属性时使用 AttributeUsage AllowMultiple?
【发布时间】:2011-01-02 07:47:59
【问题描述】:

根据我正在阅读的一本书,AttributeUsageAllowMultiple 公共属性指定:

...目标是否可以应用属性的多个实例。

为什么我想要/不想使用这个?

【问题讨论】:

    标签: c# custom-attributes attributeusage


    【解决方案1】:

    属性是元数据。通常,您需要使用 Attribute 来装饰成员或类型,以便跟踪有关它的一些信息。

    例如,PropertyGrid 使用 DescriptionAttribute 来标记属性的描述:

    [Description("This is my property")]
    public int MyProperty { get; set; }
    

    大多数时候,有多个描述是没有意义的。

    但是,一个特定的属性可能需要多次使用。在这种情况下,您需要设置 Attribute 以允许其自身的多个实例标记为同一属性。

    (不是我会这样做,但是...)假设您创建了一个自定义属性来跟踪对类的重​​大更改。您可能希望为每个重大更改列出此内容:

    [Changes(Version=1.1, Change="Added Foo Feature")]
    [Changes(Version=2.0, Change="Added Bar Feature")]
    public class MyClass
    {
        // ...
    

    【讨论】:

    • 要以您的描述示例为基础并避免“我不会这样做”更改示例,请考虑一个 LocalisedDescriptionAttribute,它同时具有语言环境和描述。这可以多次应用于不同的语言环境:[LocalisedDescription("en-NZ", "sweet as")] [LocalisedDescription("en-GB", "jolly good")].
    • 措辞比我的回答好得多:)
    • @itowlson:是的,不过,我可能会再次使用标准的本地化选项......不过,这将是另一个很好的例子。
    • 谢谢!现在,这对我来说很有意义。
    【解决方案2】:

    这个例子可能有点做作,但希望它能够说明问题。

    [Convertable(typeof(Int32)), Convertable(typeof(Double))]
    public class Test
    {
    
    }
    

    【讨论】:

      【解决方案3】:

      这取决于属性是什么。

      例如,您可以创建一个属性,将一个类标记为依赖于某些东西,并且您可以允许多个依赖项。

      对于一个具体示例,请查看SuppressMessage,它会抑制代码分析警告。一个成员可以有多个您可能想要禁止显示的警告。

      另一个例子是WebResource;一个程序集可以包含多个资源。

      【讨论】:

        【解决方案4】:

        这里没有人为的例子,我在实际的生产代码中使用了它。我写了一些代码来解析一个包含数据对的文件,比如(code=value)。我在函数上放置了一个自定义属性,以指示应该为给定代码调用它。

        [CanParseCode("G1")]
        [CanParseCode("G2")]
        private void ParseGXCodes(string code, string value)
        {
           ...
        }
        

        这种特殊的格式有点古老,而且是特定领域的,有数百种不同的代码。我的目标是编写一个框架,以便更轻松地编写文件处理器,该处理器可以只提取它需要的代码而忽略其余代码。允许多次使用相同的属性可以很容易地表达代码的意图,只需在处理每个代码的函数上声明属性即可。

        【讨论】:

          【解决方案5】:

          属性 AllowMultiple=true 的实际应用

          [ManagesType(typeof(SPEC_SEC_OC), true)]
          [ManagesType(typeof(SPEC_SEC_04_OC), true)]
          public class LibSpecSelectionView : CustomView
          {
              public LibSpecSelectionView(SPEC_SEC_OC)
              {}
              public LibSpecSelectionView(SPEC_SEC_O4_OC)
              {}
              ....
          }
          
          public static class ViewManager
          {
             ...  static Dictionary of views built via reflection
             public void LaunchView(this CollectionBaseClass cbc)
             {
                 ... Find class registered to handle cbc type in dictionary and call ctor
             }
          }
          
          SPEC_SEC_OC myOC = DataClient.Instance.GetSPEC_SEC_OC();
          myOC.LaunchView()
          

          我今天早些时候翻转了 AllowMultiple=true 以允许多次使用 ManagesType 属性。我们有数百个自定义集合类。这些自定义集合中的大多数都有一个继承自 CustomView 的视图,该视图旨在处理为特定类型的自定义集合创建 UI 视图并将其呈现给用户。 ManagesType 属性通过反射用于在我们的应用程序中构建每个视图的字典,该字典继承自 CustomView 以“注册”它旨在处理的对象类型。 LibSpecSelectionView 通过同时显示两个不同的集合来“打破这种模式”(创建两个选项卡并在一个选项卡中显示一个自定义集合,在第二个选项卡中显示另一个)因此同一个视图能够处理两个不同的自定义集合。 然后通过扩展方法利用哪些视图能够处理哪些集合类型的字典,以允许我们的任何自定义集合通过一行启动注册视图(或者如果没有“注册”视图,则为默认视图)调用视图管理器。

          【讨论】:

            猜你喜欢
            • 2010-10-25
            • 2016-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-17
            • 1970-01-01
            相关资源
            最近更新 更多