2012-01-08 6 views
2

私のリフレクション機能に使用するカスタム属性を作成する必要があります。私はそれを見るようにここでターゲットがカスタム属性のインタフェースを継承していることを確認してください

は、ユースケースです:

  • ユーザーは、いくつかのクラスを作成し、私の特別な属性(例えば[ImportantAttribute]
  • でそれをマークし、ユーザーが持つ何かをします私のライブラリの機能これらの機能は、主な問題は、クラスがWICHというのが私のライブラリ内の関数を期待は、[ImportantAttribute](私のインターフェイスを継承IMyInterfaceというでマークされたことがある[ImportantAttribute]でクラスを検索し、それらを

を何かをします例えば)

は、彼が[ImportantAttribute]と彼のクラスをマークしていない、実行時に、コンパイル時にIMyInterfaceというを継承することを忘れた場合、ユーザが知っているようにする方法はあります。この属性を指定する方法は、IMyInterfaceを継承するクラスのみです。

プロパティおよびフィールドの属性と同じです。

+1

IMyInterfaceから明示的に継承されたクラスをユーザーが作成できないのはなぜですか?私は、「重要な属性」がパーティーに持ち込むものは何ですか? –

+0

@Garry Vassこの属性は、私の関数に対して、マークされたクラスを集約する必要があると言います。ユーザーは、IMyInterfaceを継承するクラスをいくつか作成することができます。しかし、ImportantAttributeでマークされたすべてのクラスは、IMyInterfaceを実装する必要があります – Yavanosta

答えて

0

私は優れた成功を収めて構築したいくつかのフレームワークで言及した戦略を使用しました。その一例が、プラグインのインフラにメタデータを提供するためのものである:そう

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)] 
public class PluginAttribute : Attribute 
{ 
    public string DisplayName { get; set; } 
    public string Description { get; set; } 
    public string Version { get; set; } 
} 

public interface IPlug 
{ 
    void Run(IWork work); 
} 

[Plugin(DisplayName="Sample Plugin", Description="Some Sample Plugin")] 
public class SamplePlug : IPlug 
{ 
    public void Run(IWork work) { ... } 
} 

は私がそれらをインスタンス化し、メタデータプロパティを読み込むことなく、プラグインについての情報を把握することができます。そうすることで私の経験で

、私は両方の要件が満たされていることを強制するために見つけた唯一の方法は、ランタイムチェックを実行し、それが< /ドキュメントの>点滅を点滅大胆と<点滅>であることを確認することです。それは最適ではありませんが、それは(私が見つけた)実行できる最良のものです。それから、私はこれを処理するためのより良い方法があると確信していますが、これまではこれはかなり堅実でした。

1

彼は [ImportantAttribute]と彼のクラスをマークしていない、実行時に、 コンパイル時にIMyInterfaceというを継承することを忘れた場合、ユーザーに知らせるためにどのような方法があります

単純な答え:なし、これは不可能です。コンパイル時ではありません。これは、リフレクションを使用して実行時にチェックすることができます。

Obsoleteなどの特殊なシステム属性を除いてコンパイル時に属性を使用すると最適なのは、[AttributeUsage]属性での使用法を指定することです。

+0

まずはお返事ありがとうございます。 属性(クラスまたはプロパティ用)の使用を指定できますが、できる限り私のライブラリを使いやすくするようにしています。コンパイラは、私たちの友人と私たちの使命 - できるだけ多くの情報として彼を与える。実行時よりもコンパイル時にエラーが発生するのが快適です。 – Yavanosta

+0

@ Yavanosta、私は、実行時ではなくコンパイル時の安全性を提供する方が良いと思っていますが、この場合、実行時にリフレクションで動作するので、属性を使用すべきではありません。だから安全はない。たぶんあなたはあなたのデザインを考え直すべきでしょう。 –

関連する問題