目前我有一个课程如下:
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这样做,但看起来很长。有没有人知道另一种解决方法?提前谢谢。
答案 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";
}