質問
次のコードを見ました:
[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...}
上記のスニペットの機能は十分に明確であるように見えます。有用なことを行うためにそれをどのように使用できるかについてはわかりません。どんな名前を付けるのかさえわからない!
これらのプロパティ属性に関する詳細情報/チュートリアルの場所を知っている人はいますか? また、この機能が実行できる斬新で便利なタスクにも興味があります。
解決
人々はすでにUIの側面をカバーしています-属性には他の用途もありますが、たとえば、ほとんどのシリアル化フレームワークで広く使用されています。
一部の属性はコンパイラによって特別な処理が行われます。たとえば、 [PrincipalPermission(...)]
はメソッドに宣言型セキュリティを追加し、ユーザーが適切なアクセス権を持っていることを(自動的に)チェックできるようにします。
独自の特別な処理を追加するには、 PostSharp を使用できます。 PostSharpを使用してロギングなどのAOP処理を行うすばらしい例が多数あります。または自動 INotifyPropertyChanged
実装。
他のヒント
上記の機能 スニペットは十分に明確なようです
そうではないかもしれませんが、多くの人は[DefaultValue()]がプロパティの値を設定していると考えています。実際、すべてのビジュアルデザイナー(Visual Studioなど)に、コードがデフォルト値をどのように設定するかを伝えます。これにより、プロパティウィンドウの値が他の値に設定されている場合、その値を太字に認識します。
サンプルのサンプルは、ビジュアルデザイナー(つまり、MS Expression BlendとVisual Studioデザイナー)がデザイナーUIにヒントを与えるために使用します。
これらはメタデータであり、プロパティロジックには影響しないことに注意してください。たとえば、 DefaultValue
を設定しても、プロパティはデフォルトでその値に設定されません。手動で設定する必要があります。
何らかの理由でこれらの属性にアクセスする場合は、使用する必要があります。反射。
デザイナー属性の詳細については、 MSDN を参照してください。
>これらは属性と呼ばれ、msdnには多くの情報があります。 http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx
一般に、「やる」ことはありません。独自のものであれば、クラスを使用する他のコードで使用されます。 XmlSerializationは良い例です:XmlSerializer(Microsoftがフレームワークの一部として提供)は、ほぼすべてのクラス(ただし、クラスには多くの要件があります)-リフレクションを使用して、クラスに含まれるデータを確認します。 XmlSerializerがクラスをシリアル化する方法を変更するには、属性(XmlSerializerと一緒に定義)を使用できます(たとえば、データを要素ではなく属性として保存するように指示します)。
設定に使用するグラフィカルデザイナーを定義するために使用します 特定のタイプのインスタンス。
つまり、可能なコマンドをすべてロードする一種のワークフローデザイナーがいます アセンブリからの型。これらのコマンドタイプには、設定が必要なプロパティがあり、 そのため、すべてのコマンドタイプには異なるデザイナー(ユーザーコントロール)が必要です。
たとえば、次のコマンドタイプ(ソリューションではコンポジットと呼ばれます)を考えます
[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase
{
// code here
}
これは、2つの場所で使用される情報です
1)デザイナーがコマンドのリストを作成するとき、CompositeMetaDataを使用します コマンドに関する詳細情報を表示します。
2)ユーザーがデザイナーにコマンドを追加し、デザイナーが作成するとき そのクラスのインスタンスは、CompositeDesignerプロパティを調べ、 指定されたタイプ(usercontrol)の新しいインスタンスを作成し、追加します ビジュアルデザイナーに。
次のコードを考慮して、コマンドを" toolbar"にロードするために使用します:
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();
これは、カスタム属性の使用方法の一例に過ぎません
これがあなたに出発点を与えることを願っています。
これらの属性は、設計時のエクスペリエンスをカスタマイズします。