15

私は次のコードを見ました:

[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...} 

上記のスニピットの機能は十分に明確に見えますが、それを使用して便利なことを行う方法がわかりません。どんな名前を付けたらいいのかわからない!

これらのプロパティ属性に関する詳細情報/チュートリアルがどこにあるか知っている人はいますか?この機能で実行できる斬新で便利なタスクにも興味があります。

4

6 に答える 6

27

上記のスニピットの機能は十分に明確に見えますが、

多くの人が[DefaultValue()]がプロパティの値を設定すると考えているので、そうではないかもしれません。実際には、一部のビジュアルデザイナー(Visual Studioなど)に、コードがデフォルト値を設定する内容を通知するだけです。そうすれば、他の値に設定されている場合は、プロパティウィンドウの値を太字にすることがわかります。

于 2008-10-16T14:11:29.150 に答える
13

人々はすでにUIの側面をカバーしています-属性には他の用途もありますが...たとえば、ほとんどのシリアル化フレームワークで広く使用されています。一部の属性はコンパイラによって特別に扱われます。たとえば、[PrincipalPermission(...)]メソッドに宣言型セキュリティを追加して、ユーザーが適切なアクセス権を持っていることを(自動的に)チェックできるようにします。

独自の特別な処理を追加するには、PostSharpを使用できます。PostSharpを使用してロギングなどのAOPを実行したり、自動INotifyPropertyChanged実装などのコードを単純化したりする優れた例はたくさんあります。

于 2008-10-16T14:14:06.243 に答える
7

それらは属性と呼ばれ、msdnには多くの情報があります(例:http: //msdn.microsoft.com/en-us/library/z0w1kczw.aspx)。

一般に、それらはそれ自体では何も「実行」せず、クラスを使用する他のコードによって使用されます。XmlSerializationは良い例です:XmlSerializer(フレームワークの一部としてMicrosoftによって提供されます)はほとんどすべてのクラスに対応できます(ただし、クラスにはいくつかの要件があります)-リフレクションを使用して、クラスに含まれるデータを確認します。属性(XmlSerializerと一緒に定義)を使用して、XmlSerializerがクラスをシリアル化する方法を変更できます(たとえば、データを要素ではなく属性として保存するように指示します)。

于 2008-10-16T14:07:42.090 に答える
6

例にあるものは、ビジュアルデザイナー(つまり、MS ExpressionBlendとVisualStudioデザイナー)がデザイナーUIにヒントを与えるために使用します。

これらはメタデータであり、プロパティロジックには影響しないことに注意してください。たとえば、設定DefaultValueすると、デフォルトではプロパティがその値に設定されません。手動で設定する必要があります。

何らかの理由でこれらの属性にアクセスする場合は、リフレクションを使用する必要があります。

デザイナ属性の詳細については、 MSDNを参照してください。

于 2008-10-16T14:07:01.720 に答える
3

これを使用して、特定のタイプのインスタンスを構成するためにどのグラフィカル デザイナーを読み込む必要があるかを定義します。

つまり、アセンブリからすべての可能なコマンド タイプをロードする、一種のワークフロー デザイナーが用意されています。これらのコマンド タイプには構成が必要なプロパティがあるため、コマンド タイプごとに異なるデザイナー (ユーザー コントロール) が必要です。

たとえば、次のコマンド タイプを考えてみましょう (ソリューションではコンポジットと呼ばれます)。

[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();

これは、カスタム属性の使用方法の一例にすぎません。

これが出発点になることを願っています。

于 2008-10-16T15:08:20.097 に答える
2

これらの属性は、設計時のエクスペリエンスをカスタマイズします。

http://msdn.microsoft.com/en-us/library/a19191fh.aspx

于 2008-10-16T14:06:26.523 に答える