Получить имя первого аргумента в методе расширения? - PullRequest
6 голосов
/ 08 декабря 2011
string thing = "etc";
thing = thing.GetName();
//now thing == "thing"

Возможно ли это вообще?

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

Ответы [ 4 ]

4 голосов
/ 08 декабря 2011

Я согласен с ответом Рида.Однако, если вы ДЕЙСТВИТЕЛЬНО хотите достичь этой функциональности, вы могли бы выполнить эту работу:

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

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

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

4 голосов
/ 08 декабря 2011

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

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

0 голосов
/ 03 октября 2017

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

0 голосов
/ 01 сентября 2016

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

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

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

...