0

我正在用 C# 编写一个 HTTP 包装类对象,我想让 main 方法能够接收一个函数作为参数,然后在 POST/GET 返回的源 HTML 上执行它。

例如,我可能想要传递一个检查 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
    }
  }
}

所以这个函数可能会或可能不会被传入,或者我可以用它设置一个全局属性。然后我需要检查一个函数是否存在,如果存在则执行它。

该函数可以是任何东西,我想对代码进行未来验证,以便它可以处理将来可能传递给它的任何类型的函数。

任何帮助将非常感激。

谢谢

4

2 回答 2

1

使用FuncAction(或Predicate如 DavidN 所述)指定作为参数传递到您的MakeHTTPRequest方法中的委托合同。

public bool MakeHTTPRequest(string url, Action possiblefunction)
{

   make HTTP request

   if status == 200
   {

    string response = getresponse

    if(possiblefunction != null){

        possiblefunction();
    }
  }
}

如果您的“函数”返回一个值/结果,那么请改用 Func ..(其中 T 是预期的返回类型)...例如Func<int>

如果您的“函数”需要参数,则指定预期的参数类型。所以这里有一些例子:

Func<string,float,int>- 需要字符串和浮点参数并返回 int 结果的委托

Action- 不带参数且不返回值的委托

Action<string,float>- 一个不返回值 (void) 的委托,并且需要一个字符串和浮点数作为参数。

如果您试图将“响应”传回给possiblefunctionthen 做这样的事情。

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

   make HTTP request

   if status == 200
   {

    string response = getresponse

    if(possiblefunction != null){

        possiblefunction(response);
    }
  }
}
于 2013-08-30T12:40:02.780 回答
0

根据您给出的示例,您似乎真正想要的是传入一组验证器以确定 HTTP 响应是否符合某些标准。您的方法返回 bool 的事实似乎进一步证实了这一点。

一个Predicate<T>,或者实际上是一组谓词,应该封装您传入的标准规则,以确定请求是否有效。

a 的签名Predicate<T>bool Predicate<T>(T t)- 意味着它接受某种类型并产生一个 bool

使用谓词数组并确保它们都通过,对于您想要做的事情来说,这似乎是一种面向未来的方式

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 number] 参数值的方法,因此以下所有调用都可以工作:

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);
于 2013-08-30T12:53:05.147 回答