首页 新闻 会员 周边

C#中如何拦截一个托管方法?

0
悬赏园豆:30 [已解决问题] 解决于 2015-11-09 10:07

类似于Hook住某个函数或方法的样子。

public class A

{

  [Check("normaluser")]

  public void Method1()

  {

    //do sth

  }

}

 

CheckAttribute 是我自定义的一个Attribute,我想在调用方法Method1前,通过上下文和元数据来检查是否需要调用真正的Method1。如果条件不符合,Method1不会被调用。我想知道在一个方法执行前如何进行拦截,因为调用它的地方可能很多,通过反射可以实现类似功能吗?

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2015-10-13 18:59
< >
分享
最佳答案
0

无满意答案结帖。

空明流光 | 初学一级 |园豆:106 | 2015-11-09 10:07
其他回答(3)
0

是asp.net mvc么?

收获园豆:15
jackccc | 园豆:1341 (小虾三级) | 2015-10-13 22:46
1

可以了解一下AOP,将Method方法改为Virtual方法,然后用一个代理类动态创建classA的子类,创建过程中检查Attribute特性,如果有指定的特性,就拦截。需要用到classA时就用代理类创建classA子类的实例。

本来写了点示例代码的,但是要完整实现的话可能要些时间,所以后来直接帮你搜索了一下。

http://www.cnblogs.com/Zachary-Fan/p/3565716.html

收获园豆:15
I,Robot | 园豆:9783 (大侠五级) | 2015-10-14 08:57

如果这个类不是我定义的,里面的方法还可以拦截吗?

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2015-10-15 13:21
0

虽然是2015年的帖子,但是还是回复一下。
在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 OnActionExecutingAsync,来 拦截action的请求消息,当执行OnActionExecutingAsync完成以后才真正进入请求的action中,action运行完后又把控制权给了 OnActionExecutedAsync ,这个管道机制可以使我们用它来轻松实现 权限认证、日志记录 ,跨域以及很多需要对全局或者部分请求做手脚的的功能。
https://www.cnblogs.com/hnsongbiao/p/7039666.html

olivetchan | 园豆:202 (菜鸟二级) | 2019-04-14 02:59

谢谢你的回复,我问的问题不局限于mvc,而是任何c#模型,包括console,winform等。

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2019-05-09 09:16

@沧海一杰: 你的需求太奇特了,用AOP可以很好地解决,你又要求不是你定义的类,你可以试下把别人的类继承过来,也有可能别人不让继承。又要是console和winform,估计你只能去改.net的源码去实现了。
有一个好玩的委托玩法,没事交流一下:
public class HomeClass
{
public bool islogin = true;
public delegate object CheckUserStatus();
private object BootExecute(CheckUserStatus cus)
{
if (islogin) return cus();
else return "No";
}

    public object doit()
    {
        return BootExecute(delegate ()
        {
            //TODO
            return "Yes";
        });
    }
}

BootExecute就相当于是ActionFilterAttribute或是AOP,不限于MVC,这个仍然是要是你自己定义的类。

支持(0) 反对(0) olivetchan | 园豆:202 (菜鸟二级) | 2019-06-25 14:42

@olivetchan: 其实我想拦截系统中既有的代码做一些日志方面的工作或检测。比如监视 ADO.NET 中的 SqlCommand.Execute 方法来拦截所有执行过的SQL语句。比如拦截 Assembly.Load 方法,以便在系统加载某个程序集前对程序集进行解密或让系统加载另一个不同的程序集等操作。

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2019-06-28 16:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册