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)

編集:

マークの提案に従って、ネストされたジェネリックをこのクラスにカプセル化しました

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

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

別の可能性があります - それをカプセル化します。つまり、 a を返しますList<QueryRow>。ここで、はインデクサーを使用したQueryRowan の浅いラッパーです。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()

別のオプション (私はあまり好きではありません) は、次のようになります: return DataTable

入力した後、手を洗いに出かけますDataTable... gah!今二回

于 2011-11-15T14:54:54.283 に答える