2011-09-09 2 views
2

の属性、私は次のコードを持っていると想像:へのアクセスインスタンス・レベルのカスタムは、C#

class A 
{ 
    [UsefulAttribute("foo")] 
    B var1; 
    [UsefulAttribute("bar")] 
    B var2; 

    ... 
} 


class B 
{ 
    public string WriteSomethingUseful() 
    { 
     ????? 
    } 
} 

を私の質問は、どのようなコードには、に配置する必要がありますされ?????私はvar1.WriteSomethingUsefulを呼び出すときに、私はFOOの出力を取得し、私はvar2.WriteSomethingUsefulを呼び出すときに、私はバーの出力を得るように、ということ

これはかなり簡単な質問ですが、私の主な問題は、私が混乱の状態になってしまったことです。

真剣に、私はUsefulAttributeを定義し、コードの一部がGetCustomAttributes(typeof演算(UsefulAttribute)...)呼び出しでなければなりません実現しています。私が混乱しているところは、タイプレベルではなく、実際のインスタンスでこれらの値を引き出す方法です。

多くのおかげで、 ピート

+1

属性はインスタンスレベルではなくタイプレベルにあります – BrokenGlass

+0

私は現在のフォームであなたが指定した問題は不可能であるという他の回答に同意します。しかし、あなたが後に進めているパターンは、近づくことができず、非常に役に立つことがあります。私はWriteSomethingUsefulが 'WriteSomethingUseful(FieldInfo attributeContext)'のような、その所有者に関するコンテキストを渡された場合、使用可能な解決策があると確信しています。私はあなたのための完全な解決策を考え出すだろうが、私は瞬間にWindowsのデベロッパーボックスを持っていない。それにかかわらず、運が最高です。 –

答えて

5

これは不可能です。まず、Aの複数の異なるインスタンスが同じBへの参照を持つ場合はどうなりますか?あるいは、Bの同じインスタンスがvar1とvar2の両方によって参照される場合はどうでしょうか?

フィールドに属性を設定すると、フィールドvar1に格納されているクラスBのインスタンスではなく、クラスAの型にその属性が付加されます。

通常の方法は、Bのプロパティとしてデータを格納し、プロパティ設定ツールまたはコンストラクタパラメータを使用してデータを設定し、WriteSomethingUsefulメソッドからプロパティにアクセスすることです。

+0

クリス、あなたは完璧に理にかなっています。木の木が見えないことが時々あるのを知っています.... – PeteH

+0

_ ** Re Q1:**それから、彼らは呼び出されたときに異なる結果を生み出します。 ** Re Q2:**再度、コールサイト/コンテキストごとに異なる結果。明らかに、「?????」コードは動的でなければならず、異なる状況で異なる結果を生み出します。上記の正確なコードでは不可能だと私は同意しますが、それは解決できない問題ではありません.WriteSomethingUsefulは単に所有者に関するコンテキスト情報を渡すだけです。 –

+0

@ SlippD.Thompson私の答えの最後の文で説明するように、OPが望む出力を生成するコードを書くことは可能です。アトリビュートは静的なデータなので、アトリビュートを使用することはできません。それらはプロパティ定義に関連付けられており、そのプロパティに格納されているクラスのインスタンスではありません。呼び出される関数(WriteSomethingUseful)には、呼び出し元によって参照されるプロパティを示すメタデータはありません。 –

3

WriteSomethingUseful()メソッドはタイプBの中にありますが、属性はタイプAで宣言されているため、インスタンスに基づいてアクセスすることはできません。Aへの参照はありません。

電流Bインスタンスが全くAに関連し、「現在のBインスタンスを含むクラス・インスタンスのタイプ(もしあれば)」取得できずにされないかもしれない - C#では不可能である - がこれを行う一般的な方法はありません。

+0

はBGを歓迎します。答えを読んで、それは明らかです、私はちょうどラインに沿ってどこか混乱してしまいました。 – PeteH

関連する問題