Аргумент атрибута должен быть константным выражением,...- Создавать атрибут массива типов
Вот мой пользовательский атрибут и класс, в котором я его использую:
[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 или выражением создания массива типа параметра атрибута
Почему возникает эта ошибка?
Ответы
Ответ 1
Это добавляет информацию, которую Саймон уже дал.
Я нашел здесь некоторую документацию: Учебник по атрибутам. (Он говорит, что Visual Studio.NET 2003 вверху, но он по-прежнему применяется.)
Параметры атрибута ограничены постоянными значениями следующих типов:
- Простые типы (bool, byte, char, short, int, long, float и double)
- строка
- System.Type
- перечислений
- object (Аргумент параметра атрибута объекта типа должен быть постоянным значением одного из указанных выше типов.)
- Одномерные массивы любого из вышеперечисленных типов (выделено мной мной)
Последняя точка пули объясняет вашу синтаксическую ошибку. Вы определили одномерный массив, но должны быть только примитивные типы, строка и т.д., Как указано в предыдущих маркерах.
Ответ 2
Аргументы атрибута должны быть константой времени компиляции. Это означает, что компилятор должен иметь возможность "испечь" значения аргументов при сборке сборки. new ReferenceType()
не является константой - он должен быть оценен во время выполнения, чтобы определить, что это такое.
Интересно, что это немного надуманно в том, что к этому правилу есть некоторые краевые случаи. Кроме того, вы не можете делать то, что вы пытаетесь сделать.
Ответ 3
Позвольте мне добавить, что компилятор может вернуть эту ошибку без какого-либо конкретного файла или строки кода, если у вашего атрибута есть конструктор, у которого есть параметр, который не является простым типом, и вы используете конструктор (т.е. ваш непростой параметр имеет значение по умолчанию).
[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; }
}