7

我有以下课程:

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

等等

可能吗?

谢谢,戴夫

4

4 回答 4

19

您可以使用以下内容:

var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static);
var value = (string)field.GetValue(null);
于 2009-08-27T11:26:18.723 回答
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.");
        }
    }
}

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

于 2009-08-27T11:34:33.903 回答
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);

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

于 2009-08-27T11:32:23.737 回答
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];
    }
于 2013-10-07T19:03:12.490 回答