質問

実際には、どのような種類のカスタム.NET属性を使用しましたか?

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

役立つ可能性があるのに見落としているように感じます。

既にフレームワークに含まれている属性ではなく、作成する属性について説明しています。

役に立ちましたか?

解決

それらを" custom"で使用しました検証用の属性(つまり、自分の「クレジットカード検証」で検証するフィールドをマークする)および私が書いたカスタムLinqToLuceneアナライザー(つまり、特定のフィールドで使用するアナライザーを指定する)。

たとえば、検証コードは次のようになります。

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

上記のオブジェクトが検証されると、「カスタム」のおかげで、各フィールドが適切なバリデーターで検証されます。属性。

LinqToLuceneのものでは、カスタム属性を作成しました。実行時に特定のフィールドを(リフレクションを介して)検索できるためです。たとえば、顧客オブジェクトがある場合、「index me」としてマークされているすべてのプロパティを取得できます。カスタム属性は、オブジェクトに関するメタデータを公開するため、これを簡単に実行できます。クエリは簡単です。

他のヒント

スクリプトエンジンを作成し、[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>>

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

カスタム属性をよく使用している「パターン」の1つは、特にコード内のdiffの場所で列挙に依存関係がある場合に列挙を置き換えることです。

E.g。オブジェクトの状態の列挙型があります。この状態に基づいて、コード内に3つまたは4つの異なる場所があり、その列挙の「切り替え」を行い、何らかの操作を実行します。他の一部の開発者は、新しい列挙型を追加することでバグを簡単に導入できますが、コード内の別の場所でswitchステートメントのいずれかを処理しません。

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

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

私はまだカスタム属性の使用法をまだ見つけていません。カスタム属性の読み取りに関係するリフレクションは明らかに高価であるため、それらが適切かもしれないと思ったが、それらを使用しなかったいくつかの状況がありました。

「プラグイン」内のクラスにカスタム属性を配置しました。 DLL。これにより、フレームワークは使用可能なプラグインを動的に検出し、それらが興味のあるものかどうかを評価し、興味のあるプラグインを動的にロードできます。

このドメインの例は、ファミリ内の特定の車両をモデル化するプラグインです。車両ファミリの1つのプラグインは、実際に車両ファミリ内の複数の車両モデルをモデル化する場合があります(例:「MX-6」、「プローブ」)。 IDまたはモデル名がカスタム属性配列として含まれている場合、カスタム属性さえ持たないDLLをすぐに無視し、さらに対象の車両をモデル化しないDLLをさらに無視できます。

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

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

たとえば大まかな例...

他のオープンソースプロジェクトにも同様の例があります。

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

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

注:属性" Table"、" Columns"当時のカスタム属性でした。

ActiveRecordエンジンはこれらの属性のオブジェクトを解析し、CRUD ...などのそれぞれの関数を生成します

同様に、ベンチマークが必要なコードの部分を識別するためのカスタム属性をいくつか開発しました...たとえば:

[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}

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

このトピックに関するApressの本があります。 .NET Attribuesを適用してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top