按名称获取常量值

dem*_*emo 10 c# field const

我有一个常量类.我有一些字符串,可以与其中一个常量的名称相同或不同.

所以带常数的类ConstClass有一些public constconst1, const2, const3...

public static class ConstClass
{
    public const string Const1 = "Const1";
    public const string Const2 = "Const2";
    public const string Const3 = "Const3";
}
Run Code Online (Sandbox Code Playgroud)

要检查类是否const按名称包含,我已尝试过下一步:

var field = (typeof (ConstClass)).GetField(customStr);
if (field != null){
    return field.GetValue(obj) // obj doesn't exists for me
}
Run Code Online (Sandbox Code Playgroud)

不知道它是否真的是正确的方法,但现在我不知道如何获取值,导致.GetValue方法需要obj类型ConstClass(ConstClass是静态的)

ang*_*son 21

要使用反射获取字段值或在静态类型上调用成员,请将其null作为实例引用传递.

这是一个简短的LINQPad程序,演示:

void Main()
{
    typeof(Test).GetField("Value").GetValue(null).Dump();
    // Instance reference is null ----->----^^^^
}

public class Test
{
    public const int Value = 42;
}
Run Code Online (Sandbox Code Playgroud)

输出:

42
Run Code Online (Sandbox Code Playgroud)

请注意,所示代码不区分普通字段和常量字段.

为此,您必须检查字段信息是否还包含标志Literal:

这是一个只检索常量的简短LINQPad程序:

void Main()
{
    var constants =
        from fieldInfo in typeof(Test).GetFields()
        where (fieldInfo.Attributes & FieldAttributes.Literal) != 0
        select fieldInfo.Name;
    constants.Dump();
}

public class Test
{
    public const int Value = 42;
    public static readonly int Field = 42;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Value
Run Code Online (Sandbox Code Playgroud)


Lee*_*ale 6

string customStr = "const1";

if ((typeof (ConstClass)).GetField(customStr) != null)
{
    string value = (string)typeof(ConstClass).GetField(customStr).GetValue(null);
}
Run Code Online (Sandbox Code Playgroud)

  • 不,不是真的,这是不言自明的。OP 询问如何获取 const 变量的值,这就是答案。 (4认同)
  • string customStr = "const1"; 不包含“const”关键字,因此它不是常量变量。因此,不言自明与否,这不是问题的答案。 (2认同)