我有一个带有常量的类。我有一些字符串,可以与该常数之一的名称相同或不相同。
因此具有常量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);
}
答案 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 )