Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get value of constant by name

I have a class with constants. I have some string, which can be same as name of one of that constants or not.

So class with constants ConstClass has some public const like const1, const2, const3...

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

To check if class contains const by name i have tried next :

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

Don't know if it's realy correct way to do that, but now i don't know how to get value, cause .GetValue method need obj of type ConstClass (ConstClass is static)

like image 827
demo Avatar asked Nov 02 '15 12:11

demo


1 Answers

To get field values or call members on static types using reflection you pass null as the instance reference.

Here is a short LINQPad program that demonstrates:

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

public class Test
{
    public const int Value = 42;
}

Output:

42

Please note that the code as shown will not distinguish between normal fields and const fields.

To do that you must check that the field information also contains the flag Literal:

Here is a short LINQPad program that only retrieves constants:

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;
}

Output:

Value
like image 77
Lasse V. Karlsen Avatar answered Sep 30 '22 20:09

Lasse V. Karlsen