2015-11-02 4 views
4

У меня есть класс с константами. У меня есть строка, которая может быть такой же, как имя одной из этих констант или нет.Получить значение константы по имени

Так класс с константами ConstClass имеет некоторые public const как const1, const2, const3...

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

Чтобы проверить, если класс содержит const по имени я попробовал следующий:

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

Не знаю, если это действительно правильный путь для этого, но теперь я не знаю, как получить значение, причина .GetValue метод нужен obj типа ConstClass (ConstClass is static)

+1

Не могли бы вы реорганизовать свой вопрос и показать свой код, чтобы было легче следовать? (вместо * описания * вашего кода, который является * жестким *, чтобы следовать) – Amit

+2

Вместо того, чтобы использовать некоторые константы и отражение, чтобы получить их, я настоятельно рекомендую использовать словарь '. Это более эффективно, удобнее и читаемо. –

ответ

7

Чтобы получить значения полей или вызвать участников по статическим типам с использованием отражения, вы передаете null в качестве ссылки на экземпляр.

Вот короткая LINQPad программа, которая показывает:

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

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

Выход:

42 

Пожалуйста, обратите внимание, что код, как показано не будет различать между нормальными полями и константных полей.

Для этого необходимо проверить, что информация о поле также содержит флаг 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; 
} 

Выход:

Value 
2
string customStr = "const1"; 

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

Вы собираетесь объяснить свой код и как это устраняет проблему? –

+1

Нет, не совсем понятно. ОП спросил, как получить значение константной переменной, и это ответ. –

-1

typeof(YourClass).GetField(PropertyNameString).GetValue(null) будет достаточно, чтобы получить va lue of property

+0

Однострочное решение должно быть в комментарии. – Rumit

+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – rollstuhlfahrer

Смежные вопросы