如何實現通用的IEnumerable或IDictionary來避免CA1006?

c# dapper fxcop generics ienumerable

出於好奇,我想知道如何最好地實現一個可用於避免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));
    }
}

一般承認的答案

首先,請注意它是設計準則 ,而不是編譯器錯誤。這裡有一個有效的方法是:忽略它。

另一個可能是 - 封裝它;即返回List<QueryRow> ,其中QueryRow是帶有索引器的IDictionary<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()

另一種選擇(我不是非常喜歡)可能是:返回DataTable

鍵入DataTable後,他會洗手......哇!現在兩次



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因