获取静态字段的值
我有以下课程:
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可能吗?
谢谢,戴夫
您可以使用以下内容:
var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static); var value = (string)field.GetValue(null);
你可以像康拉德建议使用reflection一样。 但我认为使用字典并不依赖于reflection来完成这样的任务会更好。
public static class Pages { private static readonly IDictionary PageMap = null; private static Pages() { Pages.PageMap = new Dictionary(); 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."); } } }
您当然应该根据实际需求调整error handling。
只是我的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);
如果它被大量使用,你也可以将它们缓存在字典中。
正如其他人所说,我在这里避免使用reflection。 此外,虽然它添加了更多的代码,硬编码页面名称的枚举也是一个好主意(以前也建议)
public enum pages { LoggedOut, Login, Home } static Dictionary pageDict = new Dictionary() { {pages.Home, "Home.aspx"}, {pages.Login, "Login.aspx"}, {pages.LoggedOut, "LoggedOut.aspx"} }; public static string getPage(pages pageName) { return pageDict[pageName]; }