9

出于好奇,我想知道如何最好地实现一个可以用来避免 CA1006 警告的类

CA1006:Microsoft.Design:考虑一个设计,其中“IReader.Query(String, String)”不嵌套泛型类型“IList(Of IDictionary(Of String, Object))”。

这是返回泛型类型的方法

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();
    }
}

就像是

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

编辑:

按照 Marc 的建议,我将嵌套泛型封装在此类中

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

1 回答 1

12

首先,请注意这是一个设计指南,而不是编译器错误。这里一种有效的方法是:忽略它。

另一个可能是 - 封装它;即返回 a List<QueryRow>,其中QueryRowIDictionary<string,object>带有索引器的浅包装器,即

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; }
    }
}

然后,由于这是通过 dapper 访问的,请通过以下方式填充:

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

另一种选择(我不太喜欢)可能是: return DataTable

打字后去洗手DataTable……啊!现在两次

于 2011-11-15T14:54:54.283 回答