首页 新闻 搜索 专区 学院

请教一下关于使用C# 实现动态代理的问题?

0
悬赏园豆:200 [已解决问题] 解决于 2014-09-15 17:16

网上的资料很多都是emit或者castle通过重载类的方法来实现动态代理,这里要求类的方法必须是virtual,请问有没有通过反射并且不要求方法是virtual来实现动态代理,麻烦大家了

问题补充:

实现功能:有一个A类,现在要实现一个B类,调用A类的方法必须通过B类去调用,也就是B类是一个代理类,B类里面可以在执行A类的方法的前后做一些操作,比如记录日志等。

風吹云动的主页 風吹云动 | 初学一级 | 园豆:69
提问于:2014-09-12 17:45
< >
分享
最佳答案
0
public interface ITarget{
    
       void Method();
}

public class A:ITarget{
     
        public void Method(){}
    
}

public class B:ITarget
{
        ITarget target_;
         public B(ITarget target){
         
                   target_=target;
         }

         public void Method(){
               
               //dosomething

               target_.Method();

        }
}
                                        

是否这样?

收获园豆:50
Yu | 专家六级 |园豆:12944 | 2014-09-13 13:09

不是这样,这里面A类是不确定类,网上的资料都是用重载去实现,B是实现动态代理的,B类可以反射A类的方法,实现对A类的动态代理

風吹云动 | 园豆:69 (初学一级) | 2014-09-13 22:25

@抽烟的烦恼: 也没有ITarget?

Yu | 园豆:12944 (专家六级) | 2014-09-15 11:31

@Yu: 没,没有共同的继承同一接口

風吹云动 | 园豆:69 (初学一级) | 2014-09-15 12:54

@抽烟的烦恼: 已经OK了,用微软自带的System.Runtime.Remoting.Proxies 下的RealProxy可以满足需求

風吹云动 | 园豆:69 (初学一级) | 2014-09-15 17:17

@抽烟的烦恼: 不要把重载和重写弄混了,强迫症犯了

树形图 | 园豆:17 (初学一级) | 2014-09-15 17:30
其他回答(7)
0

不是很理解。

收获园豆:10
Firen | 园豆:5483 (大侠五级) | 2014-09-12 18:33
0

肯定可以实现,但如楼上所言,你的需求有点模糊,不是很明确,不能给你具体的方案。

收获园豆:10
519740105 | 园豆:5810 (大侠五级) | 2014-09-12 19:19
0

感觉不需要动态代理啊,B类里面处理完业务逻辑之后直接调用A类不行吗?

收获园豆:20
晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-13 09:44

问题是你有A1,A2,A3...无限多的类,这样岂不是不好

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2014-09-13 22:27

@抽烟的烦恼: 那照你这么说的话,你的B类里面需要调用很多类的很多方法,用动态代理的话你打算怎么做呢?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-15 08:08

@晓菜鸟: 使用反射的方式,把B类反射出来,实现动态代理啊,这个在AOP里面是比较基本的功能

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2014-09-15 14:18

@抽烟的烦恼: 额,你误会我意思了,我知道你是用的反射,提问的时候已经说的很清楚了,但是使用反射没要求方法一定要是virtual的啊!

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-15 14:30

@晓菜鸟: 可以了,找了半天用微软自带的System.Runtime.Remoting.Proxies 下的RealProxy可以满足需求

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2014-09-15 17:15
0

你可以看看postsharp,这是一个AOP框架。对方法、属性等都可以做日志,特点是编译的时候就确定了,不过是收费的。

收获园豆:50
achu.me | 园豆:877 (小虾三级) | 2014-09-13 11:21
0

看看这个http://www.cnblogs.com/jin-yuan/p/3811077.html,

现在有好多现成的框架就可以支持你的需求,例如Unity,Spring.net,PostSharp .....

收获园豆:20
Halower | 园豆:1723 (小虾三级) | 2014-09-14 20:04

好的谢谢

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2014-09-15 12:54
0

c++代理类

http://blog.csdn.net/biyesheng123/article/details/6669853

收获园豆:20
LiuKaiFa | 园豆:1491 (小虾三级) | 2014-09-15 07:36
0

b类里定义几个抽象或虚方法,构造方法里写必须执行的内容,然后A类覆写这些方法

收获园豆:20
树形图 | 园豆:17 (初学一级) | 2014-09-15 09:34

b类是工具生成的第三方类,优先不考虑改造,因此能不改就改

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2014-09-15 14:22

@抽烟的烦恼: b类不能改,那这个就没戏了,你可以增加一个b2类,然后其他A类继承他

支持(0) 反对(0) 树形图 | 园豆:17 (初学一级) | 2014-09-15 14:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册