.Net如何获取任意方法实参

wcl1986_1 2014-11-17 06:05:41
做项目都会有个Log类,来记录日志、错误等信息。

class Log
{
public static void Error(string ex)
{
}

}


此方法会在很多方法的catch块中调用。进而记录异常,而缺点是,无法记录调用方参数。比如下面示例。


public int Method(int a,class b)
{
try{
...do
}
catch(Exception ex)
{
Log.Error(ex.ToString());
}
}


若想记录a,b实参不得不这样写

Log.Error(a+b+ex.ToString());


但每个方法签名各不同,此种写法不太高明。
有人说可通过StackTrace类,但此类只能获取方法签名,形式参数。况且Exception类都有相关信息。

所以获取任意方法实参,显得重要,不知如何写?
...全文
435 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
生财 2015-02-09
  • 打赏
  • 举报
回复
参考一下:
    protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.StackTrace frame = new System.Diagnostics.StackTrace(System.Threading.Thread.CurrentThread,true);


        Response.Write(string.Join("<br/>", frame.GetFrames().Select(p=>p.ToString())));

        //异步请求一个数据();
    }

--方法名
Page_Load at offset 84 in file:line:column e:\xxx.aspx.cs:13:9 
Callback at offset 52 in file:line:column :0:0 
OnLoad at offset 93 in file:line:column :0:0 
LoadRecursive at offset 55 in file:line:column :0:0 
ProcessRequestMain at offset 773 in file:line:column :0:0 
ProcessRequest at offset 133 in file:line:column :0:0 
AsyncPageProcessRequestBeforeAsyncPointCancellableCallback at offset 12 in file:line:column :0:0 
InvokeCancellableCallback at offset 86 in file:line:column :0:0 
LegacyAsyncPageBeginProcessRequest at offset 193 in file:line:column :0:0 
AsyncPageBeginProcessRequest at offset 98 in file:line:column :0:0 
BeginProcessRequest at offset 54 in file:line:column c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\4d466d15\89785172\App_Web_aroumgde.2.cs:0:0 
System.Web.HttpApplication.IExecutionStep.Execute at offset 551 in file:line:column :0:0 
ExecuteStep at offset 156 in file:line:column :0:0 
ResumeSteps at offset 423 in file:line:column :0:0 
System.Web.IHttpAsyncHandler.BeginProcessRequest at offset 248 in file:line:column :0:0 
ProcessRequestInternal at offset 644 in file:line:column :0:0 
ProcessRequestNoDemand at offset 110 in file:line:column :0:0 
ProcessRequest at offset 71 in file:line:column :0:0 
Process at offset 253 in file:line:column :0:0 
ProcessRequest at offset 68 in file:line:column :0:0 
wcl1986_1 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 github_22161131 的回复:
正常方式没有办法,只能通过AOP,在IL的级别修改程序,比如PostSharp的exception-tracing 另一种使用debugger api的方式估计更不会考虑了
你的解决方案,我研究下。谢谢。
wcl1986_1 2014-11-18
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
就你的需求,要想拦截参数,应该将try catch放在调用方法的外部,你可以用emit产生代理类,调用真正的方法,而内部拦截下来去调用log,而不是把log放在method里面。
其实对于在捕获方法实参在Log中保留,大多数项目都有,但网上相关内容很少。 这位朋友,能说详细点么,emit是什么。
qqq8787216 2014-11-18
  • 打赏
  • 举报
回复
法会在很多方法的catch块中调用。
threenewbee 2014-11-17
  • 打赏
  • 举报
回复
就你的需求,要想拦截参数,应该将try catch放在调用方法的外部,你可以用emit产生代理类,调用真正的方法,而内部拦截下来去调用log,而不是把log放在method里面。
winnowc 2014-11-17
  • 打赏
  • 举报
回复
正常方式没有办法,只能通过AOP,在IL的级别修改程序,比如PostSharp的exception-tracing 另一种使用debugger api的方式估计更不会考虑了

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧