.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;
}
使用方式如前段代码所示。
- 4 回答
- 0 关注
- 484 浏览
添加回答
举报
0/150
提交
取消