Получить имя первого аргумента в методе расширения?
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: они одинаковы).