__FUNCTION__
нестандартно, __func__
существует в C99 / C++ 11. Другие (__LINE__
и __FILE__
) очень хорошо.
Это будет всегда сообщать о правильном файле и строке (и функционировать, если Вы примете решение использовать __FUNCTION__
/ __func__
). Оптимизация является нефактором, так как это - макрорасширение времени компиляции; это будет никогда производительность эффекта всегда.
Вы можете использовать следующее:
var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);
Вы можете сделать это, как предложил Конрад, используя отражение. Но я считаю, что гораздо лучше использовать словарь и не полагаться на рефлексию для такой задачи.
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.");
}
}
}
Вы, конечно, должны настроить обработку ошибок в соответствии с вашими реальными требованиями.
Только мой 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);
Если он активно используется вами также может кэшировать их в словаре.