.net自定义特性中,有没有办法控制方法执行或不执行或直接返回某个结果呢?
比如说
[MyAttribute]
public string ToStr() {
return "This is a demo class";
}
如何自定义MyAttribute这个特性,让拥有这个特性方法不执行,或者在方法之前先执行别的方法,更或者在不执行方法而直接返回某个值呢
问题的答案取决于你是如何调用这个方法的,假如你提到的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的具体形式取决于你所使用的工具,可能的工具包括:
所有这些技术的本质都是一样的——用另外一个实现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; }
使用方式如前段代码所示。
等待高手
嗯 你可以看看关于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等;
确实不懂