2009-08-19 4 views
4

私はいくつかのライブラリコードを書いています。そのコードを使用するクラスは、2つの属性を指定する必要があります(カスタム属性と.NETからの1つの属性)。カスタム属性は継承のない他の属性を暗示できますか?

この要件を文書化し、両方の属性をライブラリを使用するすべてのクラスにコピーアンドペーストするのはちょっと面倒なので、私のカスタム属性を持つことは、その他。しかし、.NETフレームワークの他の属性は封印されているため、継承できません。

これはどのような方法ですか?実行時に.NET属性を追加することはできますか?

ありがとうございました。

+0

.Net属性の内容を教えてください。 –

+0

System.ServiceModel.XmlSerializerFormatAttribute –

答えて

1

あなたはです。は、属性の継承を使用します。recommended you don'tです。

これはパフォーマンスルールに過ぎないため、正確性に違反することはありませんが、混乱の原因となる可能性があります。また、基本属性のセマンティクスに違反しないようにするために多大な労力を費やす必要があります。 AttributeUsageフラグを使用して属性の可能な場所を拡張しようとすると、問題が発生することがあります。問題の属性の規則はquite complexです。

メソッドには、2つの属性のいずれかを適用できますが、両方を適用することはできません。適用されていない操作は、そのクラスを含むクラスに適用されます。含まれているクラスにいずれかの属性が適用されていない場合は、DataContractSerializerが使用されます。

これは、その部分に合理的な計画のように密封された音にします。このAPIは、この種の拡張を考慮して設計されていません。

実行時に既存のクラスに属性を追加する方法はありません(AOPスタイルの「コードインジェクション」はありません)。

+0

これは意味があります。私は、ランタイムチェックを維持して要件を実施します。 –

0

実行時に副属性を暗示するか、属性を追加する方法はないと思います。ただし、カスタムコードテンプレートを使用して、追加するたびにすべてのクラスに属性を追加することができます。そして/または既に開発されたクラスの場合、私はあなたが各ファイルを通過してクラスに属性を追加するマクロを書くことができると思うが、過去にこれを行っていないので、クラス宣言の属性に追加するコードテンプレートを作成することは比較的簡単です。しかし、これはテンプレートを追加する時点から追加しているクラスに対してのみ機能します。古いクラスもクリーンアップする必要がある場合は、たくさんのファイルやクラスがある場合はマクロを調べます。あまりにも多くない場合は手動で行ってください。

関連する問題