1

次の属性定義があります。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class TestAttribute : Attribute
{
      public TestAttribute(List<string> values)
      {
      }
}

この属性を次のように使用すると、エラーが発生します。

[Test(new List<string>() { "123", "456" }]
class A
{
}

エラーは次のとおりです。

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式である必要があります。

何か助けてください。Visual Studio 2012 .NET 4.5 を使用しています。

params string[]の代わりに使いたくありませんList<string>

4

2 に答える 2

6

エラー メッセージが示すように、それを属性コンストラクターへの引数として指定します。通常、作成する必要があるものはすべてnew有効ではありません。これは、定数ではなく実行時に割り当てられるためです。

エラー メッセージが示すように、代わりに配列を使用できます。あなたの場合、params 配列を使用するのは非常に簡単です。

public TestAttribute(params string[] values)
{ }

次に、次のように使用できます。

[Test("123", "456")]
class A
{ }

ただし、TestAttributeクラス宣言ではなく、メソッドに対してのみ有効であると定義したことに注意してください。したがって、これはまだ失敗します。


params string[]の代わりに使いたくありませんList<string>

まあ、選択肢はあまりありません。単純な配列を使用することもできるので、new string[] {"123", "456"}代わりに書く必要がありますが、それでは何のメリットもありません。

リストが本当に必要な場合は、実際には必要ないはずですが、コンストラクターで作成できます。

public TestAttribute(params string[] values)
{
    List<string> valuesList = new List<string>(values);
}

静的なものではなく、特定の型のオブジェクトを渡したい。

動的なものを属性に渡すことはできません。これらは、宣言が処理されるかなり早い段階で評価されるため、その時点で残りのコードが実行される可能性はほとんどありません。

于 2013-10-23T19:05:16.810 に答える
5

メッセージが言うように、C# ではサポートされていません。(理由は、属性はメタデータであり、リストの初期化などのコードを実行せずにメタデータを反映/読み取りできる必要があるためです)。

ただし、params キーワードを使用できます。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class TestAttribute : Attribute
{
    public TestAttribute(params string[] values)
    {
    }
}

[Test("123", "456")]
class A
{
}
于 2013-10-23T19:04:37.587 に答える