Niedawno natknąłem się na dziwne zachowanie ze słowem kluczowym dynamic
podczas testowania czegoś. Nie jest to problem, który rozpaczliwie potrzebuję rozwiązać, ponieważ właśnie eksperymentowałem, ale zastanawiałem się, czy ktoś może rzucić jakiekolwiek światło na to, co się dzieje. Mam buildera, który zwraca obiekt HttpWebRequest
i metodę rozszerzenia na HttpWebRequest
."dynamiczne" słowo kluczowe z ukrytym wzorcem modelu konstruktora
Jedna z moich metod konstruktora przyjmuje argument string
. Cała sprawa działa, gdy przekazuję metodę budowniczego ciąg znaków, ale przekazuję mu zmienną dynamic
, która jest ciągiem, który już nie działa.
Wygląda na to, że metoda budowniczych, która ma zwrócić typ HttpWebRequestBuilder
, teraz zwraca dynamic
.
Poniższy kod jest proste było go odtworzyć, a także jest dostępny here
Uwaga
Aby to działało, skomentuj linię .SetBody(dynamicString)
i usuń linię .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";
}
}
Zgaduję, że to jest coś dziwnego w działaniu obiektów dynamic
. Ale wszelkie wyjaśnienia byłyby bardzo mile widziane.
Czytałem, że odpowiedź Eric przeszłości, ale całkowicie zapomniał o tym:/ –