どのように一般的な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));
    }
}

受け入れられた回答

まず、それは設計ガイドラインであり、コンパイラエラーではないことに注意してください。ここで有効なアプローチの1つは、無視することです。

もう1つは、カプセル化することです。すなわち、 QueryRowIDictionary<string,object>上の浅いラッパーであり、インデクサーを持つList<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経由でアクセスされているので、viaで埋めてください:

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

もう一つのオプション(私が大好きではない)は次のようなものかもしれません:return DataTable

DataTable ... gahをタイプした後に手を洗うために消えます!二度今



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ