我们用它来定义应该加载哪个图形设计器来配置
特定类型的实例。
也就是说,我们有一种工作流设计器,它可以加载所有可能的命令
来自程序集的类型。这些命令类型具有需要配置的属性,
因此每种命令类型都需要不同的设计器(用户控件)。
例如,考虑以下命令类型(在我们的解决方案中称为复合)
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
// code here
}
这是在两个地方使用的信息
1) 当设计器创建命令列表时,它使用 CompositeMetaData
显示有关该命令的更多信息。
2) 当用户向设计器添加命令并且设计器创建
该类的一个实例,它查看 CompositeDesigner 属性,
创建指定类型(用户控件)的新实例并添加它
给视觉设计师。
考虑以下代码,我们用于将命令加载到我们的“工具栏”中:
foreach (Type t in assembly.GetExportedTypes())
{
Console.WriteLine(t.Name);
if (t.Name.EndsWith("Composite"))
{
var attributes = t.GetCustomAttributes(false);
ToolboxListItem item = new ToolboxListItem();
CompositeMetaDataAttribute meta = (CompositeMetaDataAttribute)attributes
.Where(a => a.GetType() == typeof(Vialis.LightLink.Attributes.CompositeMetaDataAttribute)).First();
item.Name = meta.DisplayName;
item.Description = meta.Description;
item.Length = meta.Length;
item.CompositType = t;
this.lstCommands.Items.Add(item);
}
}
如您所见,对于名称以“Composite”结尾的程序集中的每种类型,
我们获取自定义属性并使用该信息来填充我们的 ToolboxListItem 实例。
至于加载设计器,属性是这样检索的:
var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false)
.Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault();
这只是您可以如何使用自定义属性的一个示例,
我希望这能给你一个开始的地方。