2014-09-16 2 views
23

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

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

Почему т его ошибка?

ответ

13

Аргументы атрибута должны быть константой времени компиляции. Это означает, что компилятор должен иметь возможность «испечь» значения аргументов при сборке сборки. new ReferenceType() не является постоянным - его нужно оценивать во время выполнения, чтобы определить, что это такое.

Интересно, что this is a little bit flimsy в том, что для этого правила есть некоторые кромки. Кроме того, вы не можете делать то, что вы пытаетесь сделать.

+0

Я пытался использовать статические строки, но это не сработало, поэтому мне пришлось переключиться на const – mac10688

21

Это дополняет информацию, предоставленную Саймоном.

Я нашел здесь документацию: Attributes Tutorial. (Это говорит Visual Studio .NET 2003 в верхней части, но она по-прежнему применяется.)

параметров атрибутов ограничены постоянных значения следующих типов:

  • Простых типов (BOOL, байты , голец, короткая, Int, длинная, с плавающей точкой и двойные)
  • строки
  • System.Type
  • перечисления
  • объект (Аргумент к параметру атрибута объекта типа должен быть постоянным значением одного из указанных выше типов.)
  • Одномерных массивов любых из указанных выше типов(выделено мною)

Последний балл указывает на синтаксическую ошибку. Вы определили одномерный массив, но должны быть только примитивные типы, строка и т. Д., Как указано в предыдущих пунктах.

0

Позвольте мне добавить, что компилятор может вернуть эту ошибку без какого-либо конкретного файла или строки кода, если у вашего атрибута есть конструктор, у которого есть параметр, который не является простым типом, и вы используете конструктор (т. простой параметр имеет значение по умолчанию).

[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; } 
} 
Смежные вопросы