2011-11-15 35 views
9

出於好奇,我想知道如何最好地實現,可以用來避免CA1006警告如何實現泛型IEnumerable或IDictionary來避免CA1006?

CA1006類:Microsoft.Design:考慮設計,其中「IReader.Query(字符串,字符串) '不嵌套泛型類型'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)); 
    } 
} 
+0

字典列表的意圖是什麼?是具有鍵值的行(即通過列名訪問的單元格)? –

+0

每個字典是一行,其中每個鍵是列標題,值是單元格值 – mrt181

+0

代替'.Cast'是否可以不使用'.ToDictionary'? – IAbstract

回答

12

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

另一個可能 - 封裝它;即返回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; } 
    } 
} 

然後,因爲這是正在通過短小精悍的訪問,填寫經:

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

另一種選擇(即我不太喜歡),可能是:return DataTable

在打字後關上洗手DataTable ... gah!現在兩次

+0

當我讀取返回數據表時,我幾乎吐出了一口氣;) – mrt181

+0

好的,我試過這種方式。不起作用。我得到這個消息 'System.ArgumentNullException: 參數名稱:CON 貝System.Reflection.Emit.DynamicILGenerator.Emit(操作碼操作碼,ConstructorInfo CON) 貝Dapper.SqlMapper.GetClassDeserializer(IDataReader的讀者,的Int32 startBound,長的Int32,布爾returnNullIfFirstMissing)在SqlMapper.cs:行1227.'當我添加一個無參數構造函數,查詢返回一個IEnumerable 但value屬性爲null。 – mrt181

+0

@mrt哇,完全沒有注意到這是「小巧玲瓏」。原始問題中沒有任何內容向我建議「精巧」!但是:在這種情況下,您應該可以使用非通用的Query()方法,然後依次進行轉換,即'connection.Query(....)。Select(x => new QueryRow((IDictionary )x).ToList()' - 任何用法? –