目前我有一个课程如下:
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这样做,但看起来很长.有没有人知道另一种解决方法?提前致谢.
那么你可以使用反射:
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)
您还应该考虑使用枚举,然后从枚举到名称的映射.