2010-11-21 10 views
1

2つのクラス(ClassAClassB)があり、両方ともメソッドDoSomething()を持っているとします。 ClassBにはフィールドとしてClassAが含まれ、ClassB.DoSomething()が呼び出されると、ClassA.DoSomething()への呼び出しが委任されます。また、ClassA.DoSomething()には何らかの属性があります。だから我々はC#メンバーに別のクラスの別のメンバーの属性を付けることはできますか?

class ClassA { 
    [SomeAttribute] 
    int DoSomething() { return 0; } 
} 

class ClassB { 
    public ClassA CA { get; } 
    int DoSomething() { return CA.DoSomething(); } 
} 

私の質問があるようなもの、そのコードを繰り返すことなくClassB.DoSomething()ClassA.DoSomething()上に存在する属性を適用するいくつかの方法がありますか? ClassA.DoSomething()に複数の属性がある場合はどうなりますか? [ApplyAttributes(typeof(ClassA), "DoSomething")]のような属性がありますか?

私は実行時に属性を動的に適用することを検討していませんが、これはすべてコンパイル時に発生する可能性があります。

これはSilverlightソリューション用ですので、TypeDescriptorsなどの特定のリフレクションテクニックは利用できません。

+0

classAとclassBの間には何らかの関係はありますか? –

+0

ClassBからClassA –

答えて

2

TypeDescriptorというカスタムを作成して、実行時にApplyAttributes属性を分析して関連する属性を返すことになりました。

私は、コンパイルする前にソースコードを変更するいくつかの厄介なビルドステップよりも簡単だと思います。

+0

+1への関連付けだけですが、 'TypeDescriptor'は静的密封クラスです。私はあなたが "ICustomTypeDescriptor'を実装すると言っていると思います。これは、オブジェクトに存在する場合にTypeDescriptorによって検出され使用されるインターフェースです。 http://msdn.microsoft.com/en-us/library/system.componentmodel.icustomtypedescriptor.aspx –

+0

これは私が後にしているように見えます。ありがとうございました(また、Wimの説明のために)。私はどうしたらいいのか教えてあげましょう。 –

+0

私はこのアプローチを検討しましたが、アプリケーションがSilverlightにあり、TypeDescriptorとICustomTypeDescriptorがSilverlightで利用できないように見えましたので、私はこれを未回答としてマークします。とにかくおかげさまで、彼らは確かに何かを見て興味深いもののように見えます。 –

0

属性は実行時のものです。つまり、どの属性がクラスに適用されているかを知るには、クラスの実例が必要です。

Microsoftが「サービスとしてのコンパイラ」機能を提供している場合、コンパイル時にこの情報を取得して何かを行うことができます。基本的には、コードファイルを解析して他のクラスのC#コードを変更しない限り、コンパイル時に実行しようとしていることを行う方法はありません。

クラスが継承によって関連付けられている場合は、継承可能にするために属性を定義できます。

関連する問題