搖曳的薔薇
TA貢獻(xiàn)1793條經(jīng)驗 獲得超6個贊
問題的答案取決于你是如何調(diào)用這個方法的,假如你提到的ToStr是Abc類的成員,即:
public class Abc
{
[MyAttribute]
pubilc string ToStr()
{
... ...
}
}
而且是通過Abc類型的引用調(diào)用的此方法(就像下面的代碼一樣),那么答案是不能。
Abc a = new Abc();
a.ToStr()
如果Abc實現(xiàn)某個接口(或繼承自某個基類),比如IAbc,而且ToStr是此接口的成員,那么答案依賴于你是如何得到IAbc類型的引用的,比如
Abc a = new Abc();
// 1. 這種情況下不能實現(xiàn)你期望的行為。
IAbc ia = a;
ia.ToStr();
// 2. 這種情況下可以實現(xiàn)你期望的行為。
IAbc ia = SomeFactory.Create(a);
2中SomeFactory的具體形式取決于你所使用的工具,可能的工具包括:
DynamicProxy技術(shù),可用實現(xiàn)有Castle's DynamicProxy for .net等;
AOP技術(shù),可用的實現(xiàn)有Enterprise Library等;
Mock object技術(shù),可用的實現(xiàn)有NMock2等;
.NET TypeDescriptor技術(shù),這個是.NET類庫提供的,可以參考其“目標(biāo)替換和影化”功能;
.NET Remoting技術(shù),這個也是.NET類庫提供的。
自定義,如下面的代碼所示。
所有這些技術(shù)的本質(zhì)都是一樣的——用另外一個實現(xiàn)IAbc接口的對象ia包裝a對象,它的所有方法都可以根據(jù)a對象的具體情況返回不同的結(jié)果。
下面簡要描述自定義方式的實現(xiàn)思路。
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標(biāo)記attr;
2. 進(jìn)行前處理,比如根據(jù)attr的屬性取得固定的值或者;
3. 計算inner.ToStr()的結(jié)果;
4. 進(jìn)行后處理,比如把所有字符改為大寫;
5. 返回結(jié)果。
}
private IAbc inner;
}
使用方式如前段代碼所示。
查看完整回答