Получить имя первого аргумента в методе расширения?

string thing = "etc";
thing = thing.GetName();
//now thing == "thing"

Это вообще возможно?

public static string GetName(this object obj)
{
    return ... POOF! //should == "thing"
}

4 ответа

Решение

Нет. В тот момент, когда вы используете его, "name" будет "obj" - это можно получить (с установленными символами отладки) через MethodBase.GetCurrentMethod (). GetParameters ()[0].Name.

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

Я согласен с ответом Рида. Однако, если вы действительно хотите добиться этой функциональности, вы можете сделать эту работу:

string thing = "etc";
thing = new{thing}.GetName();

GetName Метод расширения просто использовал бы отражение, чтобы получить имя первого свойства от анонимного объекта.

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

Если вам нужно исходное имя переменной внутри метода расширения, я думаю, что лучше всего это сделать:

thing.DoSomething(nameof(thing));

public static string DoSomething(this object obj, string name) {
    // name == "thing"
}

Новое в C# 6 nameof() который полностью заменит метод расширения.

if (x == null) throw new ArgumentNullException(nameof(x));
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode”

Несколько связано это CallerMemberAttribute который получит имя метода, где была вызвана функция. Полезное сравнение двух методов с примерами, относящимися к PropertyChanged события, также говорит о сгенерированном коде IL (TL;DR: они одинаковы).

Другие вопросы по тегам