介紹一下AspectF這個東西,誕生於一位微軟mvp之手,介紹它首先要從c#說起,當引入了委托這個概念的時候,它也只是c++的函數指針的封裝而 已,但是後續陸續引入的lambda表達式,匿名方法,泛型,擴展方法語法糖,讓其一次又一次的升華,一切都是如此美妙,可以說如果我把泛型的封裝再做上 去,這個框架基本就可以代表近期c#的新特征的一個集合.在不用反射或者編譯優化,這些解釋器的手段,可以說c#應該是最好,抽象程度最高的高級語言了 (如果用的話就是java好,不過那些都是寫生澀的技術,所以java的企業級框架,如此的強大)
public class AspectF
{//泛型的封裝太麻煩,而且暫時用不到,故只根據需要做個string的
//在AspectF上加入了前阻斷,並修改返回值,你要拋錯也是行的
public delegate string yson(string i);
public delegate string yDelegate(yson work,string i);
public yDelegate yChain = null;
/// <summary>
/// 如果方面在work前面返回值了不是null的值,那麼阻斷,後面的話
/// </summary>
[DebuggerStepThrough]
public AspectF yCombine(yDelegate newAspectReturnDelegate)
{
if (this.yChain == null)
{
this.yChain = newAspectReturnDelegate;
}
else
{
yDelegate existingChain = this.yChain;
yDelegate callAnother = (work,i) =>
existingChain((ii) => newAspectReturnDelegate(work,ii),i);
this.yChain = callAnother;
}
return this;
}
[DebuggerStepThrough]
public string yReturn(Func<string> work)
{
if (this.yChain == null)
{
return work();
}
else
{
var returnValue = string.Empty;
this.yChain((i) =>
{//每個yDelegate的匿名方法參數都再執行一次自己的work委托,同時加一個標識,說明是後執行,那麼就不在執行這裡的work委托,
那麼後修改返回值就出來了,而委托鏈之間,直接用它們自己的返回值了遞歸傳獲得的執行結果,由裡到外的獲得結果,用來調用,比如work("根據返回值後修改",代表執行後的常量)
if (i != null) {//判定泛型封裝用define(T)
returnValue = i;
return returnValue;
}
returnValue= work();//執行這個
return returnValue;
},null);//泛型的話,這裡傳入define(T)即可
return returnValue;
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("最後返回"+saaddsad());
}
public static string saaddsad() {
return AspectF.Define
.aPointer()
.bPointer()
.yReturn(() =>
{
var ddd="執行方法";
Console.WriteLine(ddd);
return ddd;
});
}
}
static class AspectFExt
{//語法糖的擴展類,怎麼用不到呢?好像只能系統的?
public static AspectF aPointer(this AspectF aspect)
{
return aspect.yCombine((work,i) =>
{
Console.WriteLine("a切點前");
string a= work("截斷改變");
Console.WriteLine("a切點後"+a);
work("a");
return "da";
});
}
public static AspectF bPointer(this AspectF aspect)
{
//一個需要(func<string>)的方法,判斷如果work指向底層,就執行一個空的
return aspect.yCombine((work,i) =>
{
Console.WriteLine("b切點前");
string b = work(i);//不想改變就返回i參數即可,不要使用null
Console.WriteLine("b切點後"+b);
return "fsa";
});
}
}
還
能實現執行後獲得返回值,然後改變,執行前改變,泛型封裝的話,委托和匿名方法的約束寫起來估計是比較煩的,也還有點小問題.,項目就用到前阻斷,並改變
返回值,那就這樣吧,其實只要再執行一個work,然後給一個標識,就能實現後阻斷,然後根據返回值再修改並傳遞,修改一下yReturn方法就行了.小
型項目就不需要去借助企業框架,雖然編入的方式只能手動,不過效率是大型框架不能比的
如果我也能就鑽研一門語言,專心做一門學問,或者一項工藝,無疑是幸福的吧,有一天一定要把你們全部畫出來.也許最近的傷感就是項目的後台要做完了,分離的日子越來越近了..C#不捨得啊..但是js又在等著我.我依然前行,因為有很多未知的奇跡在等著我.
你的駕駛證只能遷回你現在的戶口地汕頭市.(不是戶口地的車管所不接受你駕駛證的遷入)
現在帶上你的駕駛證,身份證,一寸白底彩色照片4張,體檢表到汕頭市的車管所辦理轉證手續,只需20元左右,是網上辦理,不用到西安提檔案.
戶口遷移證有效期一般為30天,逾期不落戶即為黑戶。你可以拿著過期的戶口遷移證去給你開具這個遷移證的派出所要求重新開據遷移證,並在有效期內落戶,這樣你的戶口就恢復了。希望我的回答對你有所幫助,祝你好運!