【发布时间】:2011-01-02 07:47:59
【问题描述】:
根据我正在阅读的一本书,AttributeUsage 的 AllowMultiple 公共属性指定:
...目标是否可以应用属性的多个实例。
为什么我想要/不想使用这个?
【问题讨论】:
标签: c# custom-attributes attributeusage
根据我正在阅读的一本书,AttributeUsage 的 AllowMultiple 公共属性指定:
...目标是否可以应用属性的多个实例。
为什么我想要/不想使用这个?
【问题讨论】:
标签: c# custom-attributes 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
{
// ...
【讨论】:
[LocalisedDescription("en-NZ", "sweet as")] [LocalisedDescription("en-GB", "jolly good")].
这个例子可能有点做作,但希望它能够说明问题。
[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 通过同时显示两个不同的集合来“打破这种模式”(创建两个选项卡并在一个选项卡中显示一个自定义集合,在第二个选项卡中显示另一个)因此同一个视图能够处理两个不同的自定义集合。 然后通过扩展方法利用哪些视图能够处理哪些集合类型的字典,以允许我们的任何自定义集合通过一行启动注册视图(或者如果没有“注册”视图,则为默认视图)调用视图管理器。
【讨论】: