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

时间:2016-03-24 06:49:21

标签: c#

目前我有一个课程如下:

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这样做,但看起来很长。有没有人知道另一种解决方法?提前谢谢。

3 个答案:

答案 0 :(得分: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
}

你还应该考虑使用枚举,然后从枚举到名称的映射。

答案 1 :(得分:2)

如果不对代码进行反射,或者将其用作示例字典,则无法实现您的目标。

您也可以将代码更改为使用C#6运算符“nameof”代替:

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

答案 2 :(得分:1)

您可以使用FieldInfo GetFields()遍历字段以获取具有所需值的属性;因此预期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";
    }