Справка по атрибутам при маршрутизации, ошибка компилятора - PullRequest
1 голос
/ 25 февраля 2011

Я создал собственный атрибут с именем RouteAttribute:

[AttributeUsage(AttributeTargets.Property)]
public class RouteAttribute : Attribute
{
    public string Url { get; set; }
    public bool CheckPhysicalUrlAccess { get; set; }
    public RouteValueDictionary Defaults { get; set; }
    public RouteValueDictionary Constraints { get; set; }
    public RouteValueDictionary DataTokens { get; set; }
}

Он используется для добавления маршрутизации через атрибут в моем классе вспомогательных URL-адресов, который содержит список URL-адресов на моем сайте, поэтому у меня есть простой способ управления URL-адресами моего сайта.

Возникла проблема с добавлением значения по умолчанию, но возникла ошибка компилятора:

[Route("~/MyPage/Home.aspx", new RouteValueDictionary { { "query", "value" } })]
public string HomePage
{
  get { return "Home" }
}

Чтобы избежать путаницы, значение устанавливается на routeurl, физический URL - из атрибута, причина в том, что я конвертирую существующий сайт, и вместо того, чтобы менять ссылки везде, как только я закончу со страницей, я иду в свой класс и меняю физический URL на новую страницу

Дает ошибку:

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Значения аргумента для конструктора атрибута хранятся в метаданных. Это накладывает жесткие ограничения на то, что вы можете указать. Просто простые типы значений, тип из typeof и простой одномерный массив этих значений. Код запрещен, на что жалуется компилятор, для оператора new требуется код.

Нет никаких ограничений на то, что вы можете сделать в теле конструктора атрибута, этот код запускается позже, когда код отражения проверяет атрибут. Предлагая что-то похожее на это:

public class RouteAttribute : Attribute
{
    public RouteAttribute(string url, string query, string value) {
       this.url = url;
       this.dunno = new RouteValueDictionary(query, value);
    }
    // etc..
}
...
[Route("~/MyPage/Home.aspx", "query", "value")]
public string HomePage
{
  get { return "Home" }
}

Это, очевидно, требует работы, я понятия не имею, что означает словарь. Будьте осторожны с побочными эффектами или потребностью в ресурсах, так как вы не знаете состояние времени выполнения, когда создается атрибут.

1 голос
/ 25 февраля 2011

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

Ошибка точно указывает, в чем проблема.

Поскольку

new RouteValueDictionary { { "query", "value" } }

не является константным выражением, не выражением typeof и не выражением создания массива, это недопустимо.

...