借助委託和反射 統一客戶端呼叫入口

2022-02-19 12:42:48 字數 2353 閱讀 2983

反射:反射是相當強大的乙個機制,它允許在執行時發現並使用編譯時還不了解的型別及其成員;

委託:system.delegate提供了幾個方法,在編譯時不知道委託的某些必要資訊時,利用本身提供的幾個方法建立並呼叫乙個委託,createdelegate、dynamicinvoke。

在做mvc專案或者webapi專案時,經常會遇到js和後台動態互動的情況,按照以前的邏輯是每個請求對應不同的url(即不同的後台action),久而久之造成很難維護的局面,讓人尷尬萬分,

$.get("/home/action4", , function (data) );

$.get("/home/action3", , function (data) );

$.get("/home/action2", , function (data) );

$.get("/home/action1", , function (data) );

每個頁面有幾個互動,不同的頁面又有很多不同的互動,每個模組。。。。。。。

但是現在借助偉大的.net平台提供的反射和委託機制,我們終於可以改變這種混亂的局面,統一前端和後台資料互動的入口:

優勢自不必說,下面是乙個測試案例:

前端ajax請求部分:

既然是統一入口,所以可以看到url不再變化,變化的只是傳入的引數,每個引數用|分隔,至於客戶端的url可以封裝成常量或其他辦法。

dynamicenvoke是什麼? 乙個後台的入口public的方法,傳遞的引數僅僅是乙個字串型別的引數,這裡可以重寫model繫結機制來支援更高階的模型型別(如陣列、集合、字典,複雜型別,具體參考

通過例項模擬asp.net mvc的model繫結機制:陣列系列文章):

public object dynamicenvoke(string item1)

delegate del = null;

trycatch (exception ex)

object callbackargs = new object[args.length - 2];

if (del.gettype() == typeof(twoint32s))

}else if (del.gettype() == typeof(onestring))

var result = del.dynamicinvoke(callbackargs);

return result;

}

這是整個解決方案的關鍵所在,主要是構建乙個delegate物件然後呼叫dynamicinvoke方法,呼叫dynamicinvoke時,它會保證在內部傳遞的引數與**方法期望的引數一致,否則丟擲異常,

執行完成後返回**方法的返回值,當然了這只是乙個測試的示例,還有很多需要修改和完善的地方。

後台完整**:

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.web;

using system.web.mvc;

internal delegate object twoint32s(int32 n1, int32 n2);

internal delegate object onestring(string str);

delegate del = null;

trycatch (exception ex)

object callbackargs = new object[args.length - 2];

if (del.gettype() == typeof(twoint32s))

}else if (del.gettype() == typeof(onestring))

var result = del.dynamicinvoke(callbackargs);

return result;

}public viewresult home()

private static object add(int n1, int n2)

private static object subtract(int32 n1, int32 n2)

private static object numchars(string str)

private static object reverse(string str)}}

前端完成**:

客戶端UI統一框架

移動應用自產生之時開始,便存在跨平台的需求,目前ios android wm平台為手機的主流平台,在我們產品做設計之前,走了足夠多的彎路 1.規劃的時候,首先從android入手,android開發完畢後,再開發windowsmobile,隨後是ios平台,帶來的問題是 關注某個平台而忽略其他平台,...

socket網路程式設計之一 客戶端和伺服器端介面函式

1.socket網路程式設計分為客戶端和伺服器端,客戶端傳送請求,伺服器端進行應答 建立連線時,伺服器端繫結埠監聽 bind listen 客戶端傳送連線請求 connect 然後伺服器端接受請求accept,至此客戶端和伺服器端可以收發訊息。需要注意 1 建立socket前需要呼叫wsastart...

socket網路程式設計之一 客戶端和伺服器端介面函式

以下為winsock。1.socket網路程式設計分為客戶端和伺服器端,客戶端傳送請求,伺服器端進行應答 建立連線時,伺服器端繫結埠監聽 bind listen 客戶端傳送連線請求 connect 然後伺服器端接受請求accept,至此客戶端和伺服器端可以收發訊息。需要注意 1 建立socket前需...