これを使用して、特定のタイプのインスタンスを構成するためにどのグラフィカル デザイナーを読み込む必要があるかを定義します。
つまり、アセンブリからすべての可能なコマンド タイプをロードする、一種のワークフロー デザイナーが用意されています。これらのコマンド タイプには構成が必要なプロパティがあるため、コマンド タイプごとに異なるデザイナー (ユーザー コントロール) が必要です。
たとえば、次のコマンド タイプを考えてみましょう (ソリューションではコンポジットと呼ばれます)。
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
// code here
}
この情報は 2 つの場所で使用されます
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();
これは、カスタム属性の使用方法の一例にすぎません。
これが出発点になることを願っています。