В настоящее время мы работаем над решением регистрации и внедрили вызов метода расширения «Журнал». При записи в файл журнала нам идеально хотелось бы написать исходное имя переменной (а не имя переменной, используемое в методе расширения).Получение исходного имени переменной из метода расширения
То, что мы в настоящее время приходится делать для этого:
public void DoSomeWork()
{
String testString = "Hey look I'm a string!";
testString.Log("testString value");
}
С помощью метода РАСШИРЕНИЯ:
public static String Log(this String valueToStore, String name)
{
// The logging code which uses the 'name' parameter
}
Проблема здесь в том, что становится трудно читать на более длинных строк кода и выглядит сгруппированным. Что было бы идеальным заключается в следующем:
public void DoSomeWork()
{
String testString = "Hey look I'm a string!";
testString.Log();
}
С помощью метода расширения:
public static String Log(this String valueToStore)
{
// The logging code which is able to retrieve the
// value 'testString' from the 'valueToStore' value
}
Является ли это вообще возможно с помощью отражения? Я знаю параметр nameof
, но это возвращает строку «valueToStore» при использовании в методе расширения.
Я не думаю, что это возможно. Эта информация теряется на этом этапе выполнения (переменная не является даже свойством или полем, на которое вы могли бы подумать). Вы можете подобрать кадр стека и изучить метод вызова для его строковых переменных, но это не поможет. btw: что бы вы ожидали от «hello world» .Log() '? –
Не следует ли поддерживать метод расширения, связанный с тем, откуда он был вызван?Я понимаю, что это будет невозможно с помощью обычного метода, но методы расширения мышления могут предложить что-то немного лишнее –
Нет, методы расширения - это просто синтаксический сахар. 'testString.Log()' в вашем примере не отличается от 'YourExtensionClass.Log (testString)'. –