カスタム属性とそれを使用しているクラスは次のとおりです。
[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式、または属性パラメーター型の配列作成式である必要があります
なぜこのエラーが発生するのですか?
これは、サイモンが既に提供した情報を補足します。
ここでいくつかのドキュメントを見つけました: Attributes Tutorial 。 (上部にVisual Studio .NET 2003とありますが、それでも適用されます。)
属性パラメーターは、次のタイプの定数値に制限されています。
- 単純型(bool、byte、char、short、int、long、float、およびdouble)
- ひも
- システムタイプ
- 列挙型
- オブジェクト(オブジェクト型の属性パラメーターの引数は、上記の型のいずれかの定数値でなければなりません。)
- 上記のタイプのいずれかの1次元配列(emphasis added by me)
最後の箇条書きでは、構文エラーについて説明しています。 1次元配列を定義しましたが、前の箇条書きにリストされているように、プリミティブ型、文字列などのみである必要があります。
属性引数はコンパイル時の定数でなければなりません。これは、アセンブリがコンパイルされるときに、コンパイラが引数の値を「ベイクイン」できる必要があることを意味します。 new ReferenceType()
は定数ではありません-実行時に評価して、それが何であるかを判断する必要があります。
興味深いことに、 これは少し薄っぺらです そのルールにはいくつかのエッジケースがあります。しかし、それ以外では、あなたがやろうとしていることはできません。
属性に単純型ではないパラメーターを持つコンストラクターがあり、コンストラクターを使用している場合(つまり、非単純なパラメーターにはデフォルト値)。
[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; }
}