Получить значение статического поля - PullRequest
7 голосов
/ 27 августа 2009

У меня есть следующий класс:

public static class Pages
{
    public static string LoggedOut = "LoggedOut.aspx";
    public static string Login = "Login.aspx";
    public static string Home = "Home.aspx";
}

Я знаю, что могу использовать Pages.Home статически, но есть причина для моего вопроса.

Я хочу, чтобы у меня был метод, который я могу вызвать так:

string pageName = Pages.GetPage("Home");

и т.д.

C'est возможно?

Спасибо, Dave

Ответы [ 4 ]

18 голосов
/ 27 августа 2009

Вы можете использовать следующее:

var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);
4 голосов
/ 27 августа 2009

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

public static class Pages
{
    private static readonly IDictionary<String, String> PageMap = null;

    private static Pages()
    {
        Pages.PageMap = new Dictionary<String, String>();

        Pages.PageMap.Add("LoggedOut", "LoggedOut.aspx");
        Pages.PageMap.Add("Login", "Login.aspx");
        Pages.PageMap.Add("Home", "Home.aspx");
    }

    public static GetPage(String pageCode)
    {
        String page;
        if (Pages.PageMap.TryGet(pageCode, out page)
        {
            return page;
        }
        else
        {
            throw new ArgumentException("Page code not found.");
        }
    }
}

Вы, конечно, должны настроить обработку ошибок в соответствии с вашими фактическими требованиями.

1 голос
/ 27 августа 2009

Просто мое tuppence ... если вы собираетесь использовать литералы ("Home"), то я бы абсолютно привязался к const, т.е. Pages.Home (они, вероятно, должны быть константами в данном примере). Подход отражения может быть полезен, если у вас есть:

string s = ...something clever...
string page = GetPage(s);

Если вы делаете переключение на const, обратите внимание, что они проявляются как статические поля:

string s = ...something clever...
FieldInfo field = typeof(Pages).GetField(s,
     BindingFlags.Static | BindingFlags.Public);
string page = (string)field.GetValue(null);

Если он используется интенсивно, вы также можете кэшировать его в словаре.

0 голосов
/ 07 октября 2013

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

    public enum pages { LoggedOut, Login, Home }

    static Dictionary<pages, string> pageDict = new Dictionary<pages, string>() {
        {pages.Home, "Home.aspx"},
        {pages.Login, "Login.aspx"},
        {pages.LoggedOut, "LoggedOut.aspx"}
    };

    public static string getPage(pages pageName)
    {
        return pageDict[pageName];
    }
...