1

私は次の素晴らしい質問を読みました: C# の属性属性について多くのことを学びました。

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

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

独自の属性を作成し、サード パーティの名前空間にある既存の属性 (State、City、Zip) を使用してクラスに追加の作業を実行したいと考えていました。たとえば、私はこれを達成しようとしています:

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 つの属性すべてであいまいな属性エラーが発生し続けます。どちらか一方を使用する代わりに、両方の属性を直接呼び出すようにコンパイラに指示できますか? 既存の属性を保持し、作成した追加の属性でクラスをマークすることなく、追加の作業を実行したいと考えています。

これは可能ですか?

4

3 に答える 3

4

どちらか一方を使用する代わりに、両方の属性を直接呼び出すようにコンパイラに指示できますか?

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

using Mine = MyOwnSuperNamespace;
using Theirs = 3rdPartyNamespace;

[Mine.State]
[Theirs.State]
...
于 2012-05-13T12:01:50.887 に答える
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..
}
于 2012-05-13T12:04:19.857 に答える
0

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

于 2012-05-13T12:02:18.127 に答える