¿Cuál es el nombre de la sintaxis utilizada en la propiedad Headers? Los encabezados se definen como public HttpRequestHeaders Headers {get;}
. Me duele la cabeza que el lado izquierdo de la expresión no sea un setter.
No lo encuentro en las características ocultas de C# o Historial de C#
var tokenRequest = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri("http://localhost"), Headers = { { HttpRequestHeader.Authorization.ToString(), "abc123" }, { HttpRequestHeader.ContentType.ToString(), "application/x-www-form-urlencoded" } }, Content = new FormUrlEncodedContent(new Dictionary<string, string> { ["grant_type"] = "client_credentials" }) };
No estoy seguro de si hay un nombre oficial para él, pero he visto que se llama inicializador de colección " tipeo de pato ", hecho implícitamente por el compilador. El compilador buscará un método Add
adecuado implementado por el tipo, así como el tipo tiene que implementar la interfaz IEnumerable
. HttpRequestMessage.Headers
finalmente se ajusta a estos dos criterios y, aunque la propiedad solo tiene un captador, el compilador traducirá el inicializador de la colección en llamadas "Agregar" consecutivas justo después de que se haya creado el objeto.
Se trata de inicializadores de objetos con inicialización de propiedad de solo lectura de colección .
Me duele la cabeza que el lado izquierdo de la expresión no sea un setter.
Usando un inicializador de colección, puede establecer el valor de una propiedad durante el constructor incluso sin un set
definido. Específicamente para una colección, la documentación vinculada anteriormente dice esto:
Los inicializadores de colección le permiten especificar uno o más inicializadores de elementos cuando inicializa un tipo de colección que implementa IEnumerable y tiene Agregar con la firma adecuada como método de instancia o método de extensión.
Esto puede ser realmente extraño (o genial, dependiendo de cómo lo mires), porque puedes construir tu propio método de extensión Add()
para casi cualquier tipo de IEnumerable y usarlo para hacer cosas realmente interesantes.
Recuerde también que cuando usa una propiedad que también es una colección u otra propiedad, no necesita un set
para llamar a métodos o cambiar valores de propiedad dentro de este objeto o colección. En su lugar, primero get
la referencia a la colección y luego usa el acceso proporcionado por esa propiedad anidada.
Por ejemplo, supongamos que tiene una variable tokenRequest
que tiene una propiedad Headers
de tipo HttpRequestHeaders
. El tipo HttpRequestHeaders
a su vez tiene un método Add()
. Para llamar a ese método, primero get
la referencia a la propiedad Headers
y el método de llamada en esa referencia. Nunca se usa ni se necesita ningún set
y, sin embargo, logró cambiar una propiedad que solo get
ha definido.
Los inicializadores de colección se aprovechan de esto.