如何在C#类中通过变量值获取变量名称

3

目前我有一个如下的类:

public static class JurisdictionList
{
    public const string NSW = "New South Wales";
    public const string NT = "Northern Territory";
    public const string QLD = "Queensland";
    public const string SA = "South Australia";
    public const string TAS = "Tasmania";
    public const string VIC = "Victoria";
    public const string WA = "Western Australia";
}

我想编写一个方法string GetJurisdictionCode(string Jurisdiction),用于返回每个常量的名称和对应的值。例如,GetJurisdictionCode(JurisdictionList.QLD)将返回 QLD。

目前我只知道使用 Switch Case 完成此操作,但这看起来相当冗长。有没有其他方法可以解决呢?谢谢提前。


1
不太确定你的意思...但是通过使用“字典”,你的情况似乎是可行的。 - Ian
不使用枚举的具体原因是什么? - uTeisT
3个回答

7

你可以使用反射:

public static string GetJurisdictionCode(string jurisdiction)
{
    return typeof(JurisdictionList)
        .GetTypeInfo()
        .DeclaredFields
        .Where(f => (string) f.GetValue(null) == jurisdiction)
        .FirstOrDefault()
        ?.Name;
}

个人建议使用Dictionary<string, string>来实现从代码到名称的映射,然后只需要使用:

return codes.Where(kvp => kvp.Value == jurisdiction)
            .FirstOrDefault()
            ?.Name;

... 或者建立第二个字典以实现双向转换。如果您还需要命名常量,可以通过反射同时构建两个字典,例如:

public static class JurisdictionList
{
    public const string NSW = "New South Wales";
    public const string NT = "Northern Territory";
    public const string QLD = "Queensland";
    public const string SA = "South Australia";
    public const string TAS = "Tasmania";
    public const string VIC = "Victoria";
    public const string WA = "Western Australia";

    private static readonly Dictionary<string, string> CodeToName =
        typeof(JurisdictionList)
            .GetTypeInfo()
            .DeclaredFields
            .Where(f => f.FieldType == typeof(string))
            .ToDictionary(f => f.Name, f => f.GetValue(null));

    private static readonly Dictionary NameToCode =
        CodeToName.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);

    // Methods using the dictionaries here
}

你也应该考虑添加一个枚举,然后将枚举映射到名称。

2

如果不对代码进行反射或修改以使用Dictionary等方法,您将无法实现您试图做的事情。

此外,您可以更改代码,使用C# 6的操作符"nameof"代替:

string code = nameof(JurisdictionList.QLD); // QLD

1
你可以使用 FieldInfoGetFields() 进行迭代以获取具有所需值的属性;因此,期望的 GetJurisdictionCode() 如下所示:
 public static string GetJurisdictionCode(string Jurisdiction) 
    {
        foreach (FieldInfo p in typeof(JurisdictionList).GetFields())
        {             
            if (string.Equals(p.GetValue(p.Name),Jurisdiction))              
                return p.Name;
        }
        return "Not Found";
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接