一个为什么要创建属性时使用AttributeUsage的AllowMultiple?
-
19-09-2019 - |
题
据一本书我读,AllowMultiple
的AttributeUsage
公共属性指定:
...目标是否可具有适用于它的属性的多个实例。
我为什么要/不希望使用此?
解决方案
的属性是元数据。通常情况下,你要装饰的成员或类型,以便一个属性来跟踪关于它的一些信息。
例如,在DescriptionAttribute用于通过PropertyGrid中标注的属性的描述:
[Description("This is my property")]
public int MyProperty { get; set; }
大多数时候,具有多于一个的描述就没有意义。
然而,可能的是,特定属性有意义的使用一次以上。在这种情况下,你要设置的属性,使标记到同一属性的本身的多个实例。
(不,我会做这个,但是......)如果你做了一个自定义属性跟踪一类的重大变化。您可能要列出此为每个重大变化:
[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
;组件可包含多个资源。
这里没有人为的例子中,我使用它在实际生产代码。我写一些代码来解析包含对等(代码=值)的数据的文件。我把一个函数的自定义属性,以表明它应该被称为一个给定的代码。
[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
...
}
此特定的格式是与特定数百个不同的代码的稍微老和域。我的目标是写一个框架,使之更容易编写文件处理器,可以只提取它需要的代码而忽略其他。允许同一属性多次使它容易通过简单地对处理每一个代码的功能(一个或多个)属性声明来表示代码的意图。
属性的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今天早些时候真以允许ManagesType属性被使用一次以上。我们有几百个自定义集合类。大多数这些定制藏品有来自CustomView继承设计用于处理用户界面视图的创建特定类型的自定义集合,它呈现给用户的视图。该ManagesType属性是通过反射用于构建的每个视图在我们的应用程序的字典,从CustomView继承到“注册”是什么对象类型,它被设计来处理。所述LibSpecSelectionView“打破了图案”由同时显示两个不同的集合(将产生两个选项卡并且示出了在一个选项卡一个自定义集合,另一个在第二个选项卡),所以相同的视图能够处理两种不同的自定义集合。 这本字典其中的观点能够处理该集合类型,然后通过一个扩展方法利用,让我们的任何自定义集合,通过一个行启动注册视图(或默认的,如果没有一个“注册”视图)打电话到视图管理器。