首页 新闻 会员 周边

.net自定义特性有办法控制下面方法执行或不执行或直接返回某个值吗

0
悬赏园豆:100 [已解决问题] 解决于 2015-05-17 21:02

.net自定义特性中,有没有办法控制方法执行或不执行或直接返回某个结果呢?

比如说   

    [MyAttribute]

    public string ToStr() {    
       return "This is a demo class";    
    }   

如何自定义MyAttribute这个特性,让拥有这个特性方法不执行,或者在方法之前先执行别的方法,更或者在不执行方法而直接返回某个值呢

sujiaya的主页 sujiaya | 初学一级 | 园豆:10
提问于:2013-04-27 10:42
< >
分享
最佳答案
1

问题的答案取决于你是如何调用这个方法的,假如你提到的ToStr是Abc类的成员,即:

public class Abc
{
    [MyAttribute]
    pubilc string ToStr()
    {
        ... ...
    }    
}

而且是通过Abc类型的引用调用的此方法(就像下面的代码一样),那么答案是不能。

Abc a = new Abc();
a.ToStr()

如果Abc实现某个接口(或继承自某个基类),比如IAbc,而且ToStr是此接口的成员,那么答案依赖于你是如何得到IAbc类型的引用的,比如

Abc a = new Abc();

// 1. 这种情况下不能实现你期望的行为。
IAbc ia =  a;
ia.ToStr();

// 2. 这种情况下可以实现你期望的行为。
IAbc ia = SomeFactory.Create(a);

2中SomeFactory的具体形式取决于你所使用的工具,可能的工具包括:

  1. DynamicProxy技术,可用实现有Castle's DynamicProxy for .net等;
  2. AOP技术,可用的实现有Enterprise Library等;
  3. Mock object技术,可用的实现有NMock2等;
  4. .NET TypeDescriptor技术,这个是.NET类库提供的,可以参考其“目标替换和影化”功能;
  5. .NET Remoting技术,这个也是.NET类库提供的。
  6. 自定义,如下面的代码所示。

所有这些技术的本质都是一样的——用另外一个实现IAbc接口的对象ia包装a对象,它的所有方法都可以根据a对象的具体情况返回不同的结果。

下面简要描述自定义方式的实现思路。

public class AbcProxy : IAbc
{
    public static IAbc Create(IAbc inner)
    {
        return new AbcProxy(inner);
    }
   
    public AbcProxy(IAbc inner)
    {
        this.inner = inner;
    }
    
    public string ToStr()
    {
        1. 使用反射方法获取inner上的MyAttribute标记attr;
        2. 进行前处理,比如根据attr的属性取得固定的值或者;
        3. 计算inner.ToStr()的结果;
        4. 进行后处理,比如把所有字符改为大写;
        5. 返回结果。
    }

    private IAbc inner;
}

使用方式如前段代码所示。

收获园豆:100
Bruce Bi | 菜鸟二级 |园豆:302 | 2013-04-30 09:28
其他回答(3)
0

等待高手

不负春光,努力生长 | 园豆:1382 (小虾三级) | 2013-04-27 11:03
0

嗯 你可以看看关于AOP的东西,面向切面编程; 本人刚好有两篇这方面的文章,希望能帮到你;

http://www.cnblogs.com/wangiqngpei557/archive/2012/07/29/2614220.html  AOP概述

http://www.cnblogs.com/wangiqngpei557/archive/2012/08/08/2628375.html AOP实现

当然你可以使用一些第三方的组件如:Sprint.net,Microsoft.EnterpriseLibrary等;

王清培 | 园豆:202 (菜鸟二级) | 2013-04-27 14:44
0

确实不懂

SOUTHER | 园豆:825 (小虾三级) | 2013-04-27 18:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册