获取静态字段的值

我有以下课程:

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]; }