Получите значение статического поля

__FUNCTION__ нестандартно, __func__ существует в C99 / C++ 11. Другие (__LINE__ и __FILE__) очень хорошо.

Это будет всегда сообщать о правильном файле и строке (и функционировать, если Вы примете решение использовать __FUNCTION__ / __func__). Оптимизация является нефактором, так как это - макрорасширение времени компиляции; это будет никогда производительность эффекта всегда.

7
задан Kim Gräsman 27 August 2009 в 11:25
поделиться

3 ответа

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

var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);
18
ответ дан 6 December 2019 в 07:51
поделиться

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

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.");
        }
    }
}

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

4
ответ дан 6 December 2019 в 07:51
поделиться

Только мой 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);

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

1
ответ дан 6 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: