class Program { static void Main(string[] args) { TestClassContext test1 = new TestClassContext(); test1.Print("11111", "aaas"); } } class MyMessageSink : IMessageSink { private IMessageSink nextSink = null; public MyMessageSink(IMessageSink messageSink) { nextSink = messageSink; } public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { return null; } public IMessageSink NextSink { get { return nextSink; } } public IMessage SyncProcessMessage(IMessage msg) { Console.WriteLine("AOP Call Begin"); IMessage returnMsg = null; Stopwatch sw = new Stopwatch(); Console.WriteLine("开始计时"); sw.Start(); returnMsg = nextSink.SyncProcessMessage(msg); Console.WriteLine("结束计时"); sw.Stop(); IMethodReturnMessage returnMessage = returnMsg as System.Runtime.Remoting.Messaging.IMethodReturnMessage; object returnValue = returnMessage.ReturnValue;//返回值 var para = returnMessage.Args; Console.WriteLine("AOP Call End"); return returnMsg; } } class MyAOPAttribute : ContextAttribute, IContributeObjectSink { public MyAOPAttribute() : base("MyAOP") { } public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink) { return new MyMessageSink(nextSink); } } [MyAOP] class TestClassContext : ContextBoundObject { public object Print(string str1, string str2) { Console.WriteLine("Print方法"); return str1 + str2 + "Hello"; } }
目前已经取得了返回值和方法的参数,但是不知道如何获取 方法申明的返回值类型,我用
string name = returnMessage.GetType().Name;
这方法获得的是返回值的类型,比如 这里返回的是字符串,这里name的值就为String,可以我想获得的是 object 这个类型,毕竟我在这里申明的就是 返回object类型嘛:
public object Print(string str1, string str2) { Console.WriteLine("Print方法"); return str1 + str2 + "Hello"; }
这个可以实现吗?
第二个问题是:我在快速监视里面,找到了一些我需要的属性,可是msg 对象中不能取得这些参数,但是既然快速监视里面可以找到属性,就说明这些属性可以获得吗,我该怎么做呢?
第三个问题,大家看看我这样获取 耗时的方法对吗。
第四个问题,如何自动捕获异常,如果仅靠如上的几个对象不能解决这个问题的话,还应该怎么做呢?
第一个问题:
var mi = returnMessage.MethodBase as MethodInfo; var rtName = mi.ReturnType.Name;
第二个问题,如果是想获取方法的参数名,可以如下:
var p = mi.GetParameters();
第三个问题,大约可以
第四个问题,获取异常如下:
var e = returnMessage.Exception;
第四个问题,我不是想获取异常呢,我是想捕获异常。
我们写代码基本是这个样子的:
try { //业务逻辑 } catch(Exception ex) { //异常记录 }
我想实现的是 打了Attribute以后,方法内部不用 再写Try Catch 代码块了,Attribute内部已经把异常给catch了
@CodeBear: 意思在Attribute里面获取异常?
@jello chen: 是的,我想在 Attribute里面自动捕获异常,并且可以记录到异常的Exception对象。
@CodeBear:
class MyAOPAttribute : ContextAttribute, IContributeObjectSink { public MyAOPAttribute() : base("MyAOP") { AppDomain.CurrentDomain.FirstChanceException += (ss,ee)=>{} } public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink) { return new MyMessageSink(nextSink); } }