我不太确定如何最好地提出这个问题,所以请随时编辑...
我有一个" Utilities"包含整个应用程序中使用的常用功能的类。我的一种方法记录了这样的exeptions:
internal static void logExeption(Type typeOfClass, string methodName, Exception exeption )
{
//Do some logging here
}
然后,每当我发现异常时,我都想在整个应用程序中调用它:
try{
//perform some action
}
catch(Exception ex)
{
Utils.logExeption(this.GetType(), System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
我想知道是否有一种方法可以避免传递前两个参数,并且只是找出类别/方法的上下文,其中异常源自 logException 方法。从长远来看,这将使我的事情变得更加清洁。
答案 0 :(得分:4)
所以你想确定调用对象和函数。虽然不建议它可以实现。使用System.Diagnostics.StackTrace来遍历堆栈;然后获得适当的StackFrame一级。然后通过在该StackFrame上使用GetMethod()来确定调用者是哪个方法。请注意,构建堆栈跟踪是一项可能很昂贵的操作,并且您的方法的调用者可能会模糊实际来自哪里。
StackFrame frame = new StackFrame(1);
MethodBase method = frame.GetMethod();
string message = String.Format("{0}.{1} : {2}",
method.DeclaringType.FullName, method.Name, message);
Console.WriteLine(message);
答案 1 :(得分:2)
请注意,frame.GetMethod().DeclaringType
可以返回null
:前一段时间我只在使用NLog logger GetCurrentClassLogger
的应用程序的发布版本上遇到此问题}})。记不清楚的情况。顺便说一下,它是known issue。
Apache log4net中有一个有趣的技巧,它允许检测来电者信息(类,方法等)。
请看一下:
LocationInfo
class(source) - 来电者位置信息的内部表示。
public class LocationInfo
{
...
public LocationInfo(Type callerStackBoundaryDeclaringType)
{
// Here is the trick. See the implementation details here.
}
...
}
LogImpl
class(source) - 记录器实现类 - ILogger接口的包装器 - 执行技巧它不能被子类化!
public class LogImpl : LoggerWrapperImpl, ILog
{
...
public LogImpl(ILogger logger) : base(logger)
{
...
}
/// <summary>
/// The fully qualified name of this declaring type not the type of any subclass.
/// </summary>
private readonly static Type ThisDeclaringType = typeof(LogImpl);
virtual public void Error(object message, Exception exception)
{
Logger.Log(ThisDeclaringType, m_levelError, message, exception);
}
...
}
答案 2 :(得分:0)
您可以使用StackTrace Class。请参阅那里与您的问题非常相似的示例。