根据我正在阅读的一本书,AllowMultiple
公共财产AttributeUsage
指定:
...目标是否可以应用属性的多个实例。
为什么我想要/不想使用它?
根据我正在阅读的一本书,AllowMultiple
公共财产AttributeUsage
指定:
...目标是否可以应用属性的多个实例。
为什么我想要/不想使用它?
属性是元数据。通常,您需要使用 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
{
// ...
这个例子可能有点做作,但希望它能够理解这一点。
[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{
}
这取决于属性是什么。
例如,您可以创建一个属性,将一个类标记为依赖于某些东西,并且您可以允许多个依赖项。
举个具体的例子,看看SuppressMessage
,它会抑制代码分析警告。一个成员可以有多个您可能想要禁止显示的警告。
另一个例子是WebResource
;一个程序集可以包含多个资源。
这里没有人为的例子,我在实际的生产代码中使用了它。我写了一些代码来解析一个包含数据对的文件,比如(code=value)。我在函数上放置了一个自定义属性,以指示应该为给定代码调用它。
[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
...
}
这种特殊的格式有点古老,并且具有数百种不同的代码特定于领域。我的目标是编写一个框架,以便更轻松地编写文件处理器,该处理器可以只提取它需要的代码而忽略其余代码。通过简单地在处理每个代码的函数上声明属性,多次允许相同的属性可以很容易地表达代码的意图。
属性 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 通过同时显示两个不同的集合来“打破这种模式”(创建两个选项卡并在一个选项卡中显示一个自定义集合,在第二个选项卡中显示另一个)因此同一个视图能够处理两个不同的自定义集合。