Construyendo dinámicamente una consulta GET con parámetros opcionales en C#
Tengo una clase que contiene todas las propiedades que una consulta que estoy construyendo podría tener (la mayoría de las cuales son opcionales)
Por ejemplo:
public class QueryClass
{
public string Offset {get; set;}
public string Limit {get; set;}
public string Sort {get; set;}
}
Luego, en un método BuildQuery()
estoy construyendo la consulta de la siguiente manera:
private string BuildQuery(QueryClass query)
{
var queryDictionary = new Dictionary<string, string="">();
if (!string.IsNullOrEmpty(query.Offset))
{
queryDictionary.Add("offset", query.Offset);
}
if (!string.IsNullOrEmpty(query.Limit))
{
queryDictionary.Add("limit", query.Limit);
}
if (!string.IsNullOrEmpty(query.Sort))
{
queryDictionary.Add("sort", query.Sort);
}
var content = new FormUrlEncodedContent(queryDictionary);
return content.ReadAsStringAsync().Result;
}
Esto funciona, pero el problema es que mi clase de consulta real es mucho más grande que esto, debe haber una forma mejor de hacerlo que tener un montón de declaraciones IF para cada propiedad opcional, pero no he sido capaz de encontrar una solución más elegante. Tampoco me gusta añadir las claves en el diccionario de esta manera, probablemente necesite un nuevo enfoque para estructurar la clase QueryClass
.</string,>
davy.ai
Como experto en TI especializado en C#, API, REST y HttpClient, recomiendo utilizar el patrón Builder para simplificar la construcción de su objeto de consulta. El patrón Builder le permite crear objetos complejos paso a paso, lo que eliminaría efectivamente la necesidad de una gran cantidad de declaraciones IF.
Puede crear una clase
QueryBuilder
que utilice el encadenamiento de métodos para establecer las propiedades opcionales de su objeto de consulta. El métodobuild()
devolverá el objeto de consulta completamente construido.Así es cómo puede implementar la clase
QueryBuilder
:Luego puede utilizar la clase
QueryBuilder
de la siguiente manera:Este enfoque no solo simplifica la construcción de su objeto de consulta, sino que también hace que su código sea más legible y mantenible.