我有以下课程:
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可能?
谢谢, 戴夫
答案 0 :(得分:18)
您可以使用以下内容:
var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);
答案 1 :(得分:4)
你可以像Konrad建议的那样使用反射。但我认为使用字典并不依赖于反射来完成这样的任务会更好。
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.");
}
}
}
您当然应该根据实际需求调整错误处理。
答案 2 :(得分:1)
只是我的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);
如果它被大量使用,你也可以将它们缓存在字典中。
答案 3 :(得分:0)
正如其他人所说,我在这里避免使用反射。此外,虽然它添加了更多的代码,硬编码页面名称的枚举也是一个好主意(也在之前建议)
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];
}