首页 新闻 会员 周边 捐助

如何利用Attribute进行方法的参数拦截,返回值拦截,获得耗时 和 自动捕获异常 一些问题

0
悬赏园豆:20 [已解决问题] 解决于 2016-05-31 13:49
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 对象中不能取得这些参数,但是既然快速监视里面可以找到属性,就说明这些属性可以获得吗,我该怎么做呢?

第三个问题,大家看看我这样获取 耗时的方法对吗。

第四个问题,如何自动捕获异常,如果仅靠如上的几个对象不能解决这个问题的话,还应该怎么做呢?

CodeBear的主页 CodeBear | 初学一级 | 园豆:3
提问于:2016-05-17 18:22
< >
分享
最佳答案
0

第一个问题:

var mi = returnMessage.MethodBase as MethodInfo;
var rtName = mi.ReturnType.Name;

第二个问题,如果是想获取方法的参数名,可以如下:

var p = mi.GetParameters();

第三个问题,大约可以

第四个问题,获取异常如下:

var e = returnMessage.Exception;

 

收获园豆:20
jello chen | 大侠五级 |园豆:7336 | 2016-05-17 22:39

第四个问题,我不是想获取异常呢,我是想捕获异常。

我们写代码基本是这个样子的:

try
{
    //业务逻辑
}
catch(Exception ex)
{
  //异常记录  
}

我想实现的是 打了Attribute以后,方法内部不用 再写Try Catch 代码块了,Attribute内部已经把异常给catch了

CodeBear | 园豆:3 (初学一级) | 2016-05-18 11:15

@CodeBear: 意思在Attribute里面获取异常?

jello chen | 园豆:7336 (大侠五级) | 2016-05-18 13:01

@jello chen: 是的,我想在 Attribute里面自动捕获异常,并且可以记录到异常的Exception对象。

CodeBear | 园豆:3 (初学一级) | 2016-05-18 13:53

@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);
        }
 
    }        
jello chen | 园豆:7336 (大侠五级) | 2016-05-18 13:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册