2013-08-30 75 views
0

我正在C#中編寫一個HTTP包裝類對象,我想給主函數接收函數作爲參數,然後在POST /得到。將函數傳遞給另一個函數

例如,我可能想要傳遞一個函數,用於檢查cookie的標頭,如果發現它,則僅返回true或傳遞檢查源內容的正則表達式函數。

我知道在PHP或JS我可以很容易地只傳遞函數作爲參數,但我不知道如何去創建與我想要使用的函數相匹配的代理。

我想代碼被稱爲「通用」成爲可能,以便它可以接受任何的功能,例如僞代碼會像

public bool MakeHTTPRequest(string url, object possiblefunction) 
{ 

    make HTTP request 

    if status == 200 
    { 

    string response = getresponse 

    if(object is function){ 

     call object 
    } 
    } 
} 

所以功能可能會或可能不會獲得通過的,否則我可能用它設置一個全球性的財產。然後我需要檢查一個函數是否存在,如果有,就執行它。

函數可能是ANYTHING,我希望將來可以驗證代碼,以便它可以處理將來傳遞給它的任何類型的函數。

任何幫助將不勝感激。

感謝

+0

使用行動,行動等.... –

+0

或者,如果該函數返回的東西:[FUNC < TResult >(http://msdn.microsoft.com/library/bb534960.aspx),Func鍵等 - 事情是,行動或功能可能需要參數(這裏的'T's)。如果需要它們,您將無法在沒有參數的情況下「調用」動作或功能。 – Corak

+0

在方法簽名中使用數據類型對象通常是不好的做法。你可以這樣做,但你需要實現大量的異常處理。 – Brandon

回答

0

根據您所提供的例子,好像是你真正想要的是一組驗證的傳遞,以確定是否HTTP響應符合一定的標準。這似乎進一步證實了你的方法正在返回布爾值的事實。

A Predicate<T>或實際上是一組謂詞,應該封裝您傳入的標準規則以確定請求是否有效。

Predicate<T>簽名是bool Predicate<T>(T t) - 這意味着它需要在某種類型的,併產生一個布爾

使用謂詞的數組,並確保它們全部通過,似乎是一個非常面向未來的路你想要做

public bool MakeHTTPRequest(string url, params Predicate<WebResponse>[] validators) 
{  
    // make HTTP requrest 

    var request = HttpWebRequest.Create(url); 
    var response = (HttpWebResponse)request.GetResponse(); 

    if (response.StatusCode == HttpStatusCode.OK){ 
     foreach(var validator in validators) 
      if (!validator(response)) 
       return false; 
    } 

    return true;  
} 

的訣竅是,params關鍵字允許您調用方法中的值[0..any號]通過對參數,可以使所有的以下的調用將工作內容:

MakeHTTPRequest("http://stackoverflow.com"); 
MakeHTTPRequest("http://stackoverflow.com", r => r.Headers.AllKeys.Contains("CookieHeader")); 
MakeHTTPRequest("http://stackoverflow.com", r => r.Headers.AllKeys.Contains("CookieHeader"), r => r.ContentLength < 10000); 
+0

邪惡,就是我想要的。你是對的。我想通過任何數量的驗證響應的函數,但我不知道它們在設計時可能包含多少或什麼。一系列函數/驗證器正是我所需要的。謝謝! – user2334626

+0

快速的問題,我注意到大部分驗證器都是簡單的布爾測試。如果我想作爲驗證器傳入一個函數,它執行多重檢查,ORS或複雜檢查,而不僅僅是一個簡單的IF A AND B和C。因此,一個檢查多個條件並且如果爲true的函數,則進一步檢查或在返回true/false之前沒有完成。因此,比內容<1000的長度或存在cookie等要複雜一些。 – user2334626

1

二者必選其一FuncAction(或由DavidN提到Predicate)指定作爲參數傳遞到您的MakeHTTPRequest方法委託合同。

public bool MakeHTTPRequest(string url, Action possiblefunction) 
{ 

    make HTTP request 

    if status == 200 
    { 

    string response = getresponse 

    if(possiblefunction != null){ 

     possiblefunction(); 
    } 
    } 
} 

如果你的「功能」返回一個值/結果,然後使用Func鍵代替。(其中T是預期收益型)... e.g。 Func<int>

如果您的「功能」需要參數,然後指定預期的參數類型。因此,這裏有一些例子:

Func<string,float,int> - 一個委託,它不帶任何參數,並且不返回值

Action<string,float> - 這預計字符串和浮動參數並返回一個int結果

Action委託 - 不返回值(void)的委託,並且需要一個字符串和浮點數作爲參數。

如果你試圖通過背面的 「迴應」 possiblefunction然後做這樣的事。

public bool MakeHTTPRequest(string url, Action<string> possiblefunction) 
{ 

    make HTTP request 

    if status == 200 
    { 

    string response = getresponse 

    if(possiblefunction != null){ 

     possiblefunction(response); 
    } 
    } 
} 
+0

如果是'MakeHTTPRequest(string url,object possiblefunction)',那麼你可以測試'var action = possiblefunction as Action; if(action!= null){action(); }' – Corak

相關問題