当记录时,你总是纠缠在字符串文字中。C#通过任何方法作为参数
我解决了这个很好的属性,字段和变量传递一个Expression<Func<T>> expression
(如解释here),所以你可以做这样的事情:
public void Demo(string someArgument)
{
LogFrameWork.LogLine("Demo"); // goal is to get rid of these string literals
LogFramework.Log(() => someArgument);
}
我想要做的方法Demo
本身类似的东西:
public void Demo(string someArgument)
{
LogFramework.Log(this.Demo);
}
我试过这样的事情:
public static void Log(Delegate method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
这:
public static void Log(Action method)
{
string methodName = method.Method.Name;
LogLine(methodName);
}
,但我得到这样的编译器错误:
我介绍了一堆使用Func<...>和Action<...>过载,但听起来过于复杂。
有没有办法用任何数量的参数和可选的结果来覆盖这个方法?
--jeroen
PS:我觉得this question可能有一定的相关性在这里,但没有答案,这让我一个“啊哈”的感觉:-)
但是,我理解你的问题,难道你不认为你会更容易和更可扩展的一些AOP框架?您可以创建自定义属性来标记在调用时应该记录的方法。 – empi 2011-03-26 16:21:43
我过去使用过AOP,它导致编译/链接时间猛增。由于.NET已经有了更高的编译/链接时间,我宁愿避免这种情况。 – 2011-03-26 16:29:38
针对我在表达式树中看到的这个常见问题的每个解决方案都使用了多重重载方法,这也有点尴尬,因为您需要包含参数。如果我要编写手动跟踪日志记录,我通常只是将方法名称作为字符串常量传递,并依靠Resharper来提醒我保持同步。 – 2011-03-26 16:33:52