es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , ,

Answer

  1. Avatar for 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étodo build() devolverá el objeto de consulta completamente construido.

    Así es cómo puede implementar la clase QueryBuilder:

    public class QueryBuilder
    {
        private string _offset;
        private string _limit;
        private string _sort;
    
        public QueryBuilder withOffset(string offset)
        {
            _offset = offset;
            return this;
        }
    
        public QueryBuilder withLimit(string limit)
        {
            _limit = limit;
            return this;
        }
    
        public QueryBuilder withSort(string sort)
        {
            _sort = sort;
            return this;
        }
    
        public QueryClass build()
        {
            return new QueryClass
            {
                Offset = _offset,
                Limit = _limit,
                Sort = _sort
                // agregar otras propiedades opcionales aquí
            };
        }
    }
    

    Luego puede utilizar la clase QueryBuilder de la siguiente manera:

    QueryBuilder builder = new QueryBuilder();
    QueryClass query = builder
        .withOffset("10")
        .withLimit("50")
        .withSort("name")
        .build();
    
    string queryString = BuildQuery(query);
    

    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.

Comments are closed.