mrt*_*181 9 c# generics ienumerable fxcop dapper
出于好奇,我想知道如何最好地实现一个可用于避免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();
}
}
Run Code Online (Sandbox Code Playgroud)
就像是
SourceData<T, U> Query(string fullFileName, string sheetName)
SourceData Query(string fullFileName, string sheetName)
Run Code Online (Sandbox Code Playgroud)
编辑:
根据Marc的建议,我在这个类中封装了嵌套泛型
public class QueryRow : List<KeyValuePair<string, object>>
{
protected internal QueryRow(IEnumerable<KeyValuePair<string, object>> dictionary)
{
this.AddRange(dictionary.Select(kvp => kvp));
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 12
首先,请注意它是设计准则,而不是编译器错误.这里有一个有效的方法是:忽略它.
另一种可能是 - 封装它; 即返回a 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; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后,因为这是通过dapper访问,填写通过:
var data = connection.Query(....)
.Select(x => new QueryRow((IDictionary<string,object>)x).ToList()
Run Code Online (Sandbox Code Playgroud)
另一个选择(我不是非常喜欢),可能是:返回DataTable.
打字后,他会洗手DataTable......哇!现在两次