【发布时间】:2016-08-03 15:16:09
【问题描述】:
我们目前正在开发一种日志记录解决方案,并且已经实现了一个名为“Log”的扩展方法。写入日志文件时,理想情况下我们希望写入原始变量名(而不是扩展方法中使用的变量名)。
我们目前要做的是:
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
}
这完全可以通过使用反射来实现吗?我知道nameofoption,但在扩展方法中使用时只返回字符串'valueToStore'。
【问题讨论】:
-
我认为这是不可能的。此信息在执行时会丢失(变量甚至不是您可以反映的属性或字段)。您可以向上走堆栈帧并检查其字符串变量的调用方法,但这无济于事。顺便说一句:你对
"hello world".Log()有什么期望? -
扩展方法是否不需要保持与调用它的位置的链接?我知道使用常规方法不可能做到这一点,但认为扩展方法可能会提供一些额外的东西
-
不,扩展方法只是语法糖。您的示例中的
testString.Log()与YourExtensionClass.Log(testString)没有什么不同。
标签: c# reflection extension-methods