Как получить nameof () переданного параметра внутри метода? - PullRequest
0 голосов
/ 23 сентября 2019

Я ищу решение для своего проекта, где у меня есть Dictionary<string, object>, и ведьма-помощник пытается получить какое-то конкретное значение из этого словаря.

Как вы можете видеть ниже, если я не наденуstringKey, я пытаюсь получить stringKey из @object (теперь он вернет "объект" ).Конечно, я могу сделать это во время разговора, но это выглядит слишком плохо для меня.

Есть ли способ сделать это в этом методе?

public static bool GetValue<T>(Dictionary<string, object> dict, ref T @object, 
    string stringKey = "") 
{
    if (string.IsNullOrEmpty(stringKey))
    {
       stringKey = nameof(@object);
    }

    dict.TryGetValue(stringKey, out var Object);
    if (Object != null)
    {
        @object = (T)Object;
        return true;
    }

    return false;
}

Пример вызова:

DPH.GetValue(dictParam, ref Browser);

Ожидается, что метод stringKey будет «Браузер» , как это будет в этом случае:

DPH.GetValue(dictParam, ref Browser, nameof(Browser));

Существуют определенные потребности, и мы не можем в настоящее время рефакторировать этот словарь для нашего объекта или нашего класса, вызываяс nameof() возможно, но не решение.

Ответы [ 3 ]

3 голосов
/ 23 сентября 2019

Вы не можете.

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

Единственное, что удаленно похоже на то, что вы хотите, это System.Runtime.CompilerServices.CallerMemberName, и это работает только для получения имени функции, которая вызвала вашу функцию.

2 голосов
/ 23 сентября 2019

Это невозможно в C #.

Вызывая

DPH.GetValue(dictParam, ref Browser);

, вы предоставляете ссылки на объекты на вызываемый метод.Browser является именованной переменной в этом случае (или свойством, или полем класса), но за этой именованной переменной есть ссылка на объект.

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

Метод GetValue получает два этих числа (ссылки) и может обращаться к объектам, используя эти числа (ссылки).

Метод неполучить любые имена переменных.

Таким образом, вы должны предоставить имя переменной, используя значение nameof(Browser) в качестве третьего аргумента.В противном случае невозможно получить имя.

1 голос
/ 23 сентября 2019

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

Причина, по которой это невозможно, заключается в том, что переменнаяимя не включено в скомпилированный вывод IL.

Примите во внимание следующее:

int Fred = 0;
string FredName = nameof(Fred);

Это объявляет Fred и FredName.Однако в IL это приводит к:

.maxstack 2
.locals init (
    [0] int32,
    [1] string
)

Вы увидите, что Fred и FredName действительно объявлены, но в качестве аргументов 0 и 1.Имена переменных не хранятся в IL.

Кроме того, код для nameof(...) просто делает это:

IL_0003: ldstr "Fred"
IL_0008: stloc.1

Загружает жестко закодированное значение "Fred" в локальную переменную 1.

К сожалению, учитывая это обстоятельство, кажется невозможным, что вы добьетесь того, чего хотите.

...