为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2018-12-07 00:55:37
.net自定义特性中,有没有办法控制方法执行或不执行或直接返回某个结果呢? 比如说        [MyAttribute]     public string ToStr() {           return "This is a demo class";        }    如何自定义MyAttribute这个特性,让拥有这个特性方法不执行,或者在方法之前先执行别的方法,更或者在不执行方法而直接返回某个值呢
查看完整描述

4 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

问题的答案取决于你是如何调用这个方法的,假如你提到的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的具体形式取决于你所使用的工具,可能的工具包括: DynamicProxy技术,可用实现有Castle's DynamicProxy for .net等; AOP技术,可用的实现有Enterprise Library等; Mock object技术,可用的实现有NMock2等; .NET TypeDescriptor技术,这个是.NET类库提供的,可以参考其“目标替换和影化”功能; .NET Remoting技术,这个也是.NET类库提供的。 自定义,如下面的代码所示。 所有这些技术的本质都是一样的——用另外一个实现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; } 使用方式如前段代码所示。
查看完整回答
反对 回复 2018-12-09
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

等待高手
查看完整回答
反对 回复 2018-12-09
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

确实不懂
查看完整回答
反对 回复 2018-12-09
  • 4 回答
  • 0 关注
  • 484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信