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

Thi*_*yen 3 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";
}
Run Code Online (Sandbox Code Playgroud)

我想写一个方法string GetJurisdictionCode(string Jurisdiction)来返回每个上面的常量的名称各自的值.例如,GetJurisdictionCode(JurisdictionList.QLD)将返回QLD.

目前我只知道使用Switch Case这样做,但看起来很长.有没有人知道另一种解决方法?提前致谢.

Jon*_*eet 7

那么你可以使用反射:

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

但我个人建议建立一个Dictionary<string, string>从代码到名称,然后只是使用:

return codes.Where(kvp => kvp.Value == jurisdiction)
            .FirstOrDefault()
            ?.Name;
Run Code Online (Sandbox Code Playgroud)

......或者建立第二本字典,向另一个方向走.如果你也想要命名常量,你总是可以通过反射建立两个字典,例如

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
}
Run Code Online (Sandbox Code Playgroud)

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