CA1006을 피하기 위해 일반 IEnumerable 또는 IDictionary를 구현하는 방법은 무엇입니까?

c# dapper fxcop generics ienumerable

문제

호기심에서 CA1006 경고를 피하기 위해 사용할 수있는 클래스를 가장 잘 구현하는 방법을 알고 싶습니다.

CA1006 : Microsoft.Design : 'IReader.Query (String, String)'가 제네릭 형식 'IList (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));
    }
}

수락 된 답변

첫째, 컴파일러 오류가 아니라 설계 지침 이라는 점에 유의하십시오. 하나의 유효한 접근법은 다음과 같습니다. 무시하십시오.

또 다른 것 - 그것을 캡슐화하십시오; 즉 QueryRowIDictionary<string,object> 의 얕은 래퍼 인 List<QueryRow> 반환합니다. 즉, 인덱서, 즉

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! 두 번 지금



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.