通过值获取常量的名称

时间:2019-01-21 14:43:27

标签: c#

我有一个带有常量的类。我有一些字符串,可以与该常数之一的名称相同或不相同。

因此具有常量ConstClass的类具有一些公共const,例如const1,const2,const3 ...

public static class ConstClass
{
    public const string Const1 = "const1";
    public const string Const2 = "const2";
    public const string Const3 = "const3";
}

是否有可能按价值竞争?

因此,“ const1”值的名称为“ Const1”

我知道该怎么做...

string customStr = "const1";
if ((typeof (ConstClass)).GetField(customStr) != null)
{
    string value = (string)typeof(ConstClass).GetField(customStr).GetValue(null);
}

3 个答案:

答案 0 :(得分:1)

首先,您必须了解您真正要解决的问题。如果您需要对所有可能的类使用通用方法,并且没有重复的值,那么可以使用以下代码:

public string GetConstNameByValue<T>(string constValue) =>
           typeof(T)
                // Gets all public and static fields
                .GetFields(BindingFlags.Static | BindingFlags.Public)
                // IsLiteral determines if its value is written at 
                //   compile time and not changeable
                // IsInitOnly determine if the field can be set 
                //   in the body of the constructor
                // for C# a field which is readonly keyword would have both true 
                //   but a const field would have only IsLiteral equal to true
                .Where(f => f.IsLiteral && !f.IsInitOnly)
                .FirstOrDefault(f => f.GetValue(null) == constValue)
                ?.Name;

但是反射速度非常慢,最好不要使用它。同样,您不能使用多个常量具有相同值的情况。

如果只有一个类具有常量值的集合,那么最好为该类提供一个不使用反射的方法:

public string GetConstNameByValue(string constValue)
{
    if (ConstClass.Const1 == constValue)
        return nameof(ConstClass.Const1);
    if (ConstClass.Const2 == constValue)
        return nameof(ConstClass.Const2);
    if (ConstClass.Const3 == constValue)
        return nameof(ConstClass.Const3);
    throw new ArgumentException("There is no constants with expectedValue", nameof(constValue));
}

答案 1 :(得分:1)

您可以尝试反思:

var expextedValue = "const1";
var props = typeof(ConstClass).GetFields(BindingFlags.Public | BindingFlags.Static);
var wantedProp = props.FirstOrDefault(prop => (string)prop.GetValue(null) == expextedValue );

答案 2 :(得分:1)

简单的解决方案。

示例:

public static class Names
{
   public const string name1 = "Name 01";
   public const string name2 = "Name 02";

   public static string GetNames(string code)
   {
      foreach (var field in typeof(Names).GetFields())
      {
         if ((string)field.GetValue(null) == code)
         return field.Name.ToString();
      }
      return "";
   }
}

及其后将显示“名称1”

string result = Names.GetNames("Name 01");
Console.WriteLine(result )