【问题标题】:Get value of static field获取静态字段的值
【发布时间】:2009-08-27 11:23:13
【问题描述】:

我有以下课程:

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

等等

可能吗?

谢谢, 戴夫

【问题讨论】:

  • 顺便说一句,您真的应该将这些字段标记为readonly 或改用只读属性。
  • const 应尽可能避免,因为这些值不是运行时常量,而是编译时。如果您使用私有 const 字段,这应该不是问题,但如果您引用程序集并使用程序集中某个类的 const 字段,则该值将替换为 @987654328 的文字值@ 场地。如果您现在更改值并仅替换引用的程序集而不重新编译引用程序集,则旧值仍保留在引用程序集中,这很可能会导致不良行为。

标签: c# .net reflection static-members


【解决方案1】:

您可以使用以下内容:

var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);

【讨论】:

  • 字符串字段 = typeof(Pages).GetField("Home").GetValue(null);只是改为一行并删除了不必要的绑定。
【解决方案2】:

您可以像 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.");
        }
    }
}

您当然应该根据您的实际需求调整错误处理。

【讨论】:

  • 由于他的原始类对三个页面属性进行了硬编码,因此他可以使用这些值的枚举作为 Pages 字典中的键。有助于避免拼写错误。
  • 如果页面集合是静态的(如原始代码所示),那很好。
【解决方案3】:

只是我的 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);

如果它被大量使用,你也可以将它们缓存在字典中。

【讨论】:

    【解决方案4】:

    正如其他人所说,我会避免在这里使用反射。此外,虽然它添加了更多代码,但硬编码页面名称的枚举也是一个好主意(之前也建议过)

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

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2010-10-12
      • 2019-05-29
      相关资源
      最近更新 更多