18

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

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

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

4

5 回答 5

24

属性是元数据。通常,您需要使用 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
{
    // ...
于 2010-01-07T01:48:08.660 回答
5

这个例子可能有点做作,但希望它能够理解这一点。

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

}
于 2010-01-07T01:46:37.277 回答
2

这取决于属性是什么。

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

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

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

于 2010-01-07T01:47:39.783 回答
1

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

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

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

于 2010-01-07T01:55:20.303 回答
0

属性 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 通过同时显示两个不同的集合来“打破这种模式”(创建两个选项卡并在一个选项卡中显示一个自定义集合,在第二个选项卡中显示另一个)因此同一个视图能够处理两个不同的自定义集合。

于 2014-03-21T02:36:15.057 回答