我最近碰到一個奇怪的行爲與dynamic
關鍵字,而我正在測試的東西。這不是我急需解決的問題,因爲我只是在試驗,但我想知道是否有人可以解釋發生了什麼「動態」關鍵字與生成器模式隱藏擴展方法
我有一個構建器,它返回HttpWebRequest
對象和HttpWebRequest
上的擴展方法。
我的一個構建器方法需要參數string
。整個事情的作品,當我通過建設者的方法一個字符串,但我通過它一個dynamic
變量這是一個字符串,它不再工作。
看起來應該返回類型HttpWebRequestBuilder
的構建方法現在返回dynamic
。
下面的代碼是一個簡單的被複制它,也可here
注意
要使其工作,註釋掉線.SetBody(dynamicString)
並取消行.SetBody(json)
。
public class Program
{
public static void Main()
{
dynamic dynamicString = "{ \"test\" : \"value\" }";
string json = "{ \"test\" : \"value\" }";
string test = new HttpWebRequestBuilder()
.SetRequestType()
//.SetBody(json) //uncomment this and it works
.SetBody(dynamicString) //uncomment this and it breaks
.Build()
.ExtensionMethod();
Console.WriteLine(test);
}
}
public class HttpWebRequestBuilder
{
private readonly HttpWebRequest _request;
public HttpWebRequestBuilder()
{
Uri uri = new Uri("http://www.google.com");
_request = WebRequest.CreateHttp(uri);
}
public HttpWebRequestBuilder SetRequestType()
{
_request.Method = "POST";
_request.ContentType = "application/json";
return this;
}
public HttpWebRequestBuilder SetBody(string json)
{
byte[] bytes = Encoding.UTF8.GetBytes(json);
_request.ContentLength = bytes.Length;
using (Stream writer = _request.GetRequestStream())
{
writer.Write(bytes, 0, bytes.Length);
writer.Flush();
}
return this;
}
public HttpWebRequest Build()
{
return _request;
}
}
public static class WebRequestExtensions
{
public static string ExtensionMethod(this HttpWebRequest webRequest)
{
return "extension method worked";
}
}
我猜這是奇怪的方式dynamic
對象的工作方式。但任何解釋將不勝感激。
我讀埃裏克在過去的這個問題的答案,但我完全忘了關於它:/ –