Пользовательские атрибуты и перечислители - PullRequest
0 голосов
/ 27 октября 2010

У меня есть enum:

public enum Navigation
{
    Top = 0,
    Left = 2,
    Footer = 3
}

И у меня есть действие контроллера:

public ActionResult Quotes()
{
    return View();
}

Я бы хотел украсить свое действие следующим образом:

[Navigation.Top]
public ActionResult Quotes()
{
    return View();
}

Любая идея, как это можно сделать, вероятно, мне придется создать собственный атрибут, но как мне включить в него это перечисление?

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Один подход:

public static class Navigation{
  public class Top:ActionFilter /*any attribute*/{
   //magic
  }
  public class Left:ActionFilter{
   //magic
  }
}

[Navigation.Top]
public ActionResult Whatever(){}

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

public class NavigationAttribute:Attribute{
  public Navigation Place {get;set;}
}

[Navigation(Place=Navigation.Top)]
public ActionResult Whatever(){}
1 голос
/ 27 октября 2010

Аннотации атрибутов могут создаваться только с классами, производными от System.Attribute class.

Таким образом, невозможно использовать enum напрямую.

Однако возможно передать ваше значение перечисления в конструктор пользовательского атрибута. Как это:

enum Navigation 
{
    Top = 0,
    Left = 2,
    Footer = 3,
}
class NavigationAttribute: Attribute
{
    Navigation _nav;
    public NavigationAttribute(Navigation navigation){
        _nav = navigation;
    }
}
...
[Navigation(Navigation.Top)]
public ActionResult Quotes()
{
    return View();
}
...