为什么在创建属性时想要使用AttributeUsage AllowMultiple?

时间:2010-01-07 01:43:06

标签: c# custom-attributes attributeusage

根据我正在阅读的一本书,AllowMultiple的{​​{1}}公共财产指定:

  

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

为什么我要/不想使用它?

5 个答案:

答案 0 :(得分:22)

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

例如,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
{
    // ...

答案 1 :(得分:5)

这个例子可能有点人为,但希望它可以解决问题。

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

}

答案 2 :(得分:2)

这取决于属性。

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

有关具体示例,请查看SuppressMessage,它会抑制代码分析警告。成员可以有多个警告,您可能想要压制它们。

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

答案 3 :(得分:1)

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

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

这种特殊格式有点陈旧,特定于域,有数百种不同的代码。我的目标是编写一个框架,以便更容易编写文件处理器,只能提取所需的代码而忽略其余的代码。多次允许相同的属性使得通过简单地声明处理每个代码的函数的属性,可以很容易地表达代码的意图。

答案 4 :(得分:0)

属性的真实世界应用AllowMultiple =真实有用

[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属性通过反射用于在我们的应用程序中构建每个View的字典,该字典继承自CustomView以“注册”它旨在处理的对象类型。 LibSpecSelectionView通过同时显示两个不同的集合来“破坏该模式”(创建两个选项卡并在一个选项卡中显示一个自定义集合,在另一个选项卡中显示另一个)因此相同的视图能够处理两个不同的自定义集合。 然后,通过扩展方法利用哪些视图能够处理哪些集合类型的字典,以允许我们的任何自定义集合通过一行启动已注册的视图(如果没有“已注册”视图,则为默认视图)打电话给视图管理员。