¿Cómo implementar IEnumerable genérico o IDictionary para evitar CA1006?

c# dapper fxcop generics ienumerable

Pregunta

Por curiosidad, me gustaría saber cómo implementar mejor una clase que podría usarse para evitar la advertencia CA1006.

CA1006: Microsoft.Design: considere un diseño donde 'IReader.Query (String, String)' no anida el tipo genérico 'IList (Of IDictionary (Of String, Object))'.

Este es el método que devuelve el tipo genérico

public virtual IList<IDictionary<string, object>> Query(
    string fullFileName, 
    string sheetName)
{
    using (var connection = new OdbcConnection(
        this.GetOdbcConnectionString(fullFileName)))
    {
        connection.Open();
        return connection
            .Query(string.Format(
                CultureInfo.InvariantCulture,
                SystemResources.ExcelReader_Query_select_top_128___from__0_,
                sheetName))
            .Cast<IDictionary<string, object>>()
            .ToList();
    }
}

Algo como

SourceData<T, U> Query(string fullFileName, string sheetName)
SourceData Query(string fullFileName, string sheetName)

EDITAR:

Siguiendo las sugerencias de Marc, encapsulé el genérico anidado en esta clase

public class QueryRow : List<KeyValuePair<string, object>>
{
    protected internal QueryRow(IEnumerable<KeyValuePair<string, object>> dictionary)
    {
        this.AddRange(dictionary.Select(kvp => kvp));
    }
}

Respuesta aceptada

En primer lugar, tenga en cuenta que es una guía de diseño, no un error del compilador. Un enfoque válido sería: ignorarlo.

Otro podría ser: encapsularlo; es decir, devuelve una List<QueryRow> , donde QueryRow es un contenedor poco profundo sobre un IDictionary<string,object> con un indexador, es decir,

public class QueryRow {
    private readonly IDictionary<string,object> values;
    internal QueryRow(IDictionary<string,object> values) {
        this.values = values;
    }
    public object this[string key] {
        get { return values[key]; }
        set { values[key] = value; }
    }
}

luego, dado que se está accediendo a través de dapper, rellene a través de:

var data = connection.Query(....)
        .Select(x => new QueryRow((IDictionary<string,object>)x).ToList()

Otra opción (que no me gusta mucho) podría ser: devolver DataTable .

se va para lavarse las manos después de tipear DataTable ... ¡gah! dos veces ahora



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué