【转载】C#打印当前行号和函数名和Unity log

| 发布     | 分类 C#  | 标签 C#  StackFrame 

转载:http://www.dpull.com/blog/2014-09-08-csharp_trace

昨天杨教授在群里面问我一个问题,如何用C#打印当前行号和函数名,类似于C中的 FILE, LINE, THIS_FUNCTION 关键字。

我当时给出的方案是几年前我写ASP服务端时用的方法,代码如下:

void Log(string format, params object[] arg)
{
	var sf = new System.Diagnostics.StackFrame(1, true);
	string info = string.Format(format, arg);
	string log = string.Format(
		"{0}\tFile:{1}\tLine:{2}\t{3}\t{4}",
		System.DateTime.Now.ToString("MM-dd HH:mm:ss"), 
		sf.GetFileName(), 
		sf.GetFileLineNumber(), 
		sf.GetMethod(), 
		info
	);
	// ...
}



晚上闲着无聊随手翻了一下MSDN,看到一篇Caller Information的文档,可以使用如下Attribute实现这个功能,效率也会更高:

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}



不过这些Attribute是.Net4.5提供的,而杨教授弄这个是为Unity3d,自然不支持了。

提到Unity3d的log文件,其实没必要自己获取这些,使用Debug.Log写日志,会自动记录。

在我的项目里面,使用 Application.RegisterLogCallback 注册了一个回调函数,就实现了这些功能。



上一篇: Unity性能优化学习资源汇总
下一篇: Unity资源管理