Подтвердить что ты не робот

Аргумент атрибута должен быть константным выражением,...- Создавать атрибут массива типов

Вот мой пользовательский атрибут и класс, в котором я его использую:

[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 или выражением создания массива типа параметра атрибута

Почему возникает эта ошибка?

4b9b3361

Ответ 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; }
}