2011-11-15 7 views
9

iyi CA1006 uyarısınıCA1006'yı önlemek için genel IEnumerable veya IDictionary nasıl uygulanır? Microsoft.Design: i istiyorum meraktan

CA1006 önlemek için kullanılabilecek bir sınıf nasıl uygulanacağı bilmek bir tasarım düşünün burada 'IReader.Query (String, String) 'jenerik tip yuvalamıyor' IList (Of String (Of ​​String, Object)).

Bu

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(); 
    } 
} 

şey

SourceData<T, U> Query(string fullFileName, string sheetName) 
SourceData Query(string fullFileName, string sheetName) 

DÜZENLEME

gibi genel tür döndüren bir yöntemdir: Bu sınıftaki iç içe jenerik kapsüllü Marc'ın önerileri takiben

+0

Burada sözlüklerin amacı nedir? Anahtarlı değerler (yani sütun ismine göre erişilen hücreler) olan satırlar mı? –

+0

her sözlük, her anahtarın sütun üstbilgisi olduğu ve değerin – mrt181

+0

hücre değeri olduğu bir satırdır. ".Cast" yerine ".ToDictionary" işlevini kullanamazsınız? – IAbstract

cevap

12

Öncelikle, bir derleyici hatası değil, bir yönergesi tasarımının olduğunu unutmayın. Buradaki geçerli bir yaklaşım şöyle olurdu: görmezden gel.

Başka bir şey olabilir - kapsülleyebilir; Bu dapper erişilen çünkü örneğin dolgu, daha sonra QueryRow gösterilen indekse sahip bir IDictionary<string,object> sığ bir sarıcı bir List<QueryRow>, örneğin,

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; } 
    } 
} 

geri ile:

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

başka seçenek (diğer bir deyişle Ben çok düşkün değilim), olabilir: DataTable dönüş. DataTable ... gah yazdıktan sonra ellerini yıkamak için gider! iki kez şimdi

+0

Veriyi okuduğumda neredeyse puklediyorum;) – mrt181

+0

Tamam, bu şekilde denedim. Çalışmıyor. Bu mesaj çıktı 'System.ArgumentNullException: ParameterName: con bei System.Reflection.Emit.DynamicILGenerator.Emit (işlem kodu işlem kodu, ConstructorInfo con) bei Dapper.SqlMapper.GetClassDeserializer (IDataReader okuyucu, ınt32 startBound, ınt32 uzunluğu, Boolean returnNullIfFirstMissing) SqlMapper.cs içinde: satır 1227. parametresiz bir kurucu eklediğimde, Query bir IEnumerable döndürür, ancak value özelliği boştur. – mrt181

+0

@mrt woah, bunun tamamen "dapper" olduğunu fark etmedi. Orijinal sorudaki hiçbir şey bana "dapper" önermedi! Ancak: bu durumda, jenerik olmayan Query() yöntemini kullanabilmelisiniz, daha sonra her birini sırasıyla çeviriniz, yani 'connection.Query (....). Select (x => new QueryRow ((IDictionary ) x) .ToList() '- herhangi bir kullanım? –

İlgili konular