Значения аргумента для конструктора атрибута хранятся в метаданных. Это накладывает жесткие ограничения на то, что вы можете указать. Просто простые типы значений, тип из 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" }
}
Это, очевидно, требует работы, я понятия не имею, что означает словарь. Будьте осторожны с побочными эффектами или потребностью в ресурсах, так как вы не знаете состояние времени выполнения, когда создается атрибут.