web-dev-qa-db-ja.com

属性引数は定数式である必要があります、...-配列型の属性を作成します

カスタム属性とそれを使用しているクラスは次のとおりです。

[MethodAttribute(new []{new MethodAttributeMembers(), new MethodAttributeMembers()})]
public class JN_Country
{

}

public class MethodAttribute : Attribute
{
    public MethodAttributeMembers[] MethodAttributeMembers { get; set; }

    public MethodAttribute(MethodAttributeMembers[] methodAttributeMemberses)
    {
        MethodAttributeMembers = methodAttributeMemberses;
    }
}

public class MethodAttributeMembers
{
    public string MethodName { get; set; }
    public string Method { get; set; }
    public string MethodTitle { get; set; }
}

上記の最初の行に表示される構文エラー:

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

なぜこのエラーが発生するのですか?

33

これは、サイモンが既に提供した情報を補足します。

ここでいくつかのドキュメントを見つけました: Attributes Tutorial(上部にVisual Studio .NET 2003とありますが、それでも適用されます。)

属性パラメーターは、次のタイプの定数値に制限されています。

  • 単純型(bool、byte、char、short、int、long、float、およびdouble)
  • ひも
  • システムタイプ
  • 列挙型
  • オブジェクト(オブジェクト型の属性パラメーターの引数は、上記の型のいずれかの定数値でなければなりません。)
  • 上記のタイプのいずれかの1次元配列(emphasis added by me)

最後の箇条書きでは、構文エラーについて説明しています。 1次元配列を定義しましたが、前の箇条書きにリストされているように、プリミティブ型、文字列などのみである必要があります。

29
Grant

属性引数はコンパイル時の定数でなければなりません。これは、アセンブリがコンパイルされるときに、コンパイラが引数の値を「ベイクイン」できる必要があることを意味します。 new ReferenceType()は定数ではありません-実行時に評価して、それが何であるかを判断する必要があります。

興味深いことに、 これは少し薄っぺらです そのルールにはいくつかのエッジケースがあります。しかし、それ以外では、あなたがやろうとしていることはできません。

21
Simon Whitehead

属性に単純型ではないパラメーターを持つコンストラクターがあり、コンストラクターを使用している場合(つまり、非単純なパラメーターにはデフォルト値)。

[MyAttribute(MySimpleParameter: "Foo")]
public class MyObject
{

}

public class MyAttribute : Attribute
{
    public string MySimpleProperty { get; set; }

    public MyPropertyClass MyComplexProperty { get; set; }

    public MethodAttribute(string MySimpleParameter, MyPropertyClass MyComplexParameter = null)
    {
        MySimpleProperty = MySimpleParameter;
        MyComplexProperty = MyComplexParameter;
    }
}

public class MyPropertyClass
{
    public string Name { get; set; }
    public string Method { get; set; }
}
0
jahu