2012-05-13 4 views
0

私は次の偉大な質問を読んだ:Attributes in C#と属性についてたくさん学んだ。c#あいまいな属性

私はいくつかの属性を使用するライブラリを使用しています。例:

[State] 
public class USStates 
{ 
    [City] 
    public void isNewYork() { } 
    [Zip] 
    public ZipCode GetZipCode() { } 
} 

私は自分の属性を作成して、サードパーティの名前空間からある既存の属性(州、市、郵便番号)を使用して、私のクラスには、追加の作業を実行したかったです。例えば、私はこれを達成しようとしています:

using 3rdPartyNamespace; 
using MyOwnSuperNamespace; 

public class State : Attribute 
{ 
    // my own implementation/extension of State 
} 

// create City, Zip attributes respectively 

[State] 
public class USStates 
{ 
    [City] 
    public void isNewYork() { } 
    [Zip] 
    public ZipCode GetZipCode() { } 
} 

私は上記のが、保存のすべての3つの属性のあいまいな属性のエラーを取得してみました。私は両方の属性のどちらかを使用するのではなく、両方の属性に直接コールするようにコンパイラに指示できますか?私は既存の属性を保持し、私が作成した追加の属性をクラスにマークすることなく、追加の作業を実行したいと思います。

これは可能ですか?

+1

はありません、ではない可能性 –

+1

サードパーティは、密封されたクラスの属性定義をしていますか? –

+0

@ 32bitkid:いいえ、封印されていません。 *編集:すべての返信を読んだ後、私の疑惑が確認されます。 :) –

答えて

4

hoどちらを使用するのではなく、両方の属性を直接コールするようにコンパイラに指示できますか?

両方の属性を適用する場合は、両方の属性を指定する必要があります。属性名を完全修飾するか、別名ディレクティブusingを使用する必要があります。

using Mine = MyOwnSuperNamespace; 
using Theirs = 3rdPartyNamespace; 

[Mine.State] 
[Theirs.State] 
... 
0

あなたは[State]に両方属性を解決したいですか?それは全く不可能です。両方を指定し、あいまいさを避けるために名前空間も使用する必要があります。

1

State属性を拡張して、独自のプロパティを追加することができます。たとえば:

public class MyState : StateAttribute 
{ 
    public string MyProperty {get;set;} 
} 

// create City, Zip attributes respectively 

[MyState {MyProperty = "Test"}] 
public class USStates 
{ 
    [City] 
    public void isNewYork() { } 
    [Zip] 
    public ZipCode GetZipCode() { } 
} 

あなたはこのように属性確認することができます。

USStates states = new USStates(); 
var attribute = states.GetType().GetCustomAttributes(typeof(MyStateAttribute, false)).FirstOrDefault(); 
if (attribute != null) 
{ 
    var prop = attribute.MyProperty; 
// Do stuff.. 
} 
+0

素晴らしい説明カミルおかげで:) –

関連する問題