Определите название константы на основе значения

Это поздний вклад, но есть действительный случай для кастинга json_decode с (array).
Рассмотрим следующее:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Если $jsondata когда-либо будет возвращено как пустая строка (как, по моему опыту, часто), json_decode вернет NULL, что приведет к ошибке Предупреждение: неверный аргумент указан для foreach () в строке 3 . Вы можете добавить строку кода if / then или троичного оператора, но IMO чище просто изменить строку 2 на ...

$arr = (array) json_decode($jsondata,true);

... если вы не json_decode используете одновременно миллионы больших массивов, и в этом случае, как указывает @ TCB13, производительность может ухудшиться.

5
задан Fraser 27 August 2009 в 16:58
поделиться

6 ответов

В общем, нельзя. Может быть любое количество констант с одинаковым значением. Если вы знаете класс, который объявил константу, вы можете найти все общедоступные статические поля и посмотреть, есть ли какие-либо со значением 0, но не более того. С другой стороны, этого может быть достаточно для вас - не так ли? Если так ...

public string FindConstantName<T>(Type containingType, T value)
{
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;

    foreach (FieldInfo field in containingType.GetFields
             (BindingFlags.Static | BindingFlags.Public))
    {
        if (field.FieldType == typeof(T) &&
            comparer.Equals(value, (T) field.GetValue(null)))
        {
            return field.Name; // There could be others, of course...
        }
    }
    return null; // Or throw an exception
}
15
ответ дан 18 December 2019 в 06:12
поделиться

Вместо этого вас могут заинтересовать Enums, которые можно программно преобразовать из имени в значение и наоборот.

3
ответ дан 18 December 2019 в 06:12
поделиться

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

Другими словами, компилятор принимает это:

class Foo
{
    uint someField = ERR_OK;
}

и превращает это в следующее:

class Foo
{
    uint someField = 0;
}
2
ответ дан 18 December 2019 в 06:12
поделиться

Я предлагаю вам использовать перечисление для представления вашей константы.

Или

string ReturnConstant(uint val)
{
     if(val == 0x00000000)
       return "ERR_OK";
     else
       return null;
}
1
ответ дан 18 December 2019 в 06:12
поделиться

Самый простой способ - перейти на использование перечисления

1
ответ дан 18 December 2019 в 06:12
поделиться

Я не думаю, что вы можете сделать это детерминированным образом. Что, если существует несколько констант с одинаковым значением?

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: