8

現実世界でカスタム.NET属性を使用したことはどのようなものでしたか?現実世界のカスタム.NET属性の使用

私はそれらについていくつかの記事を読んだことがありますが、私は決してカスタム属性を使用していません。

私は彼らが役に立ったときに私がそれらを見落としているように感じる。

私はあなたが作成した属性について話していますが、既にフレームワークに含まれているものではありません。

+2

他のSOFlowがそれらを使用する方法は次のとおりです。http://www.google.com/#hl=en&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson

答えて

4

私は検証のために "カスタム"属性を使用しました(つまり、自分自身の "クレジットカード検証"で検証されたフィールドのマーキング)、私が書いた独自のLinqToLuceneアナライザ所与のフィールド)。

検証コードは、例えば、次のようになります:

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

上記目的が検証される

は、各フィールドは、「カスタム」属性に適切なバリデータのおかげで検証されます。

私が書いたLinqToLuceneの項目では、実行時に特定のフィールドを(反射によって)見つけることができるので、カスタム属性を書いた方がいいです。たとえば、顧客オブジェクトがある場合は、「インデックス」とマークされたすべてのプロパティを取得することができます。カスタム属性を使用すると、オブジェクトに関するメタデータをクエリが簡単です。

0

いくつかのオブジェクトをカスタム(レガシー)形式にシリアル化する必要がありました。属性を使用して、シリアル化するフィールドとそのフォーマット方法を識別しました。次に、私はシリアライザを持っていました。このシリアライザは、これらの属性を持つオブジェクトを取得し、リフレクションを使用してフォーマットします。

+0

あなたは '本当にあなた自身のカスタム属性を使用していましたか? –

+0

heeeeeeeeeeeeee – abmv

0

私はActiveRecordパターンに基づいて開発したORMフレームワークの1つでこれを使用しました。これは、LINQ、Castleプロジェクトなどで利用できる同じ種類の実装です。

フレームワークは「SkyFramework」と呼ばれていましたが、opensourceではありませんでした。

大まかな例...

他のオープンソースプロジェクトでも同様の例が見つかります。

[Sky.Table ("user")] 
public class User 
{ 
    [Sky.Column ("username")] 
    public string UserName; 

    [Sky.Column ("pwd")] 
    public string Password; 
} 

注:属性「表」、「列」のカスタムは、その時点で属性でした。

ActiveRecordのエンジンは、等...これらの属性のオブジェクトを解析し、CRUDのための各機能を生成...同様

は、私がベンチマークする必要があるコードの部分を識別するためのいくつかのカスタム属性を開発しました。例えば、

上記の属性でマークされたメソッドは自動的にベンチマークされ、ログが生成されます。これらはいくつかの初期の実装でした。

トピックには、 Applied .NET AttribuesというApressの書籍があります。あなたに役立つかもしれません。

+0

属性を記述しましたか? –

+0

テーブル、列、BenchMarkなどは、Attributeクラスから派生したオブジェクトです。パーサーエンジンは、それを処理するだけでなく、これらのオブジェクトは、常にいくつかのファクトリクラスによってインスタンス化されるので、メソッドにフックをつけることができます。 –

+0

そして今持っているLINQの類似の属性と混同しないでください。これは、属性がそれ自身の名前空間に入っている古いコードです。 –

1

とりわけ、実行時に読み込まれたEBNFを指定してカスタムパーサーを作成し、データベースのフィールドに関するメタデータを指定するために使用しました。

私は一般にカスタム属性を使用している 'パターン'は、特にコード内のdiff場所の列挙型に依存する場合には、列挙型を置き換えることです。

など。私はオブジェクトの状態の列挙型を持っているかもしれません。この状態に基づいて、私はおそらく、その列挙型の「切り替え」を行い、何らかの操作を行う、コード内に3つまたは4つの異なる場所を持っています。他の開発者のなかには、新しい列挙型を追加することでバグを導入することはできますが、コード内のswitch文のいずれかで処理することはできません。

これを回避するには、静的クラスに宣言されたカスタム属性を作成します。カスタム属性は、クラスの静的コンストラクターにディクショナリにロードされ、コード内のすべての場所はswitchステートメントの代わりにディクショナリを使用します。カスタム属性コンストラクタには、各switch文の 'ハードコードされた'値が含まれています。

5

私はスクリプトエンジンを作成し、[Command]属性でさまざまなメソッドにタグを付けました。これは、これらの機能がスクリプトエンジンに公開されたことを意味していました。

例:

[Command(HelpText = "Lists active users")] 
void ListUsers(void) 
{ 

} 

[Command(HelpText = "Terminate a specific user's connection")] 
void EndConnection(int userID) 
{ 

} 

そして使用など:

MyScriptEngine>> Help 
Available Commands are: 
    ListUsers: Lists active users 
    EndConnection {userID}: Terminate a specific user's connection 

MyScriptEngine>> EndConnection 3 
    User 3 (Michael) has had his connection terminated. 

MyScriptEngine>> 
0

は、私は本当にまだのようカスタム属性の使用を発見していません。私は彼らが適切かもしれないと思ったが、カスタム属性を読み込むことに関わる反射がかなり高価であるため、それらを使用しなかったという状況がいくつかありました。

0

「プラグイン」DLL内のクラスにカスタム属性を配置しました。これにより、フレームワークは利用可能なプラグインを動的に発見し、関心があるかどうかを評価し、関心のあるプラグインを動的にロードすることができます。

この例は、家族内の特定の車両をモデル化するプラグインです。車両ファミリ用の1つのプラグインは、車両ファミリー内のいくつかの車両モデル(例えば、「MX-6」、「プローブ」)を実際にモデル化することができる。 IDまたはモデル名がカスタムアトリビュート配列として含まれている場合、カスタムアトリビュートを持たないDLLもすばやく無視して、対象のビークルをモデル化していないものはすべて無視します。

関連する問題