2015-08-04 19 views
6

.NET türleri ve SQL türleri arasında eşlemek için arama tabloları olarak sözlükler kullandığım statik bir sınıfım var. İşte böyle bir sözlüğe bir örnektir: ConcurrentDictionary nasıl başlatılır? Hata: "Özel yönteme erişilemiyor" Buraya ekle "

private static readonly Dictionary<Type, string> SqlServerMap = new Dictionary<Type, string> 
{ 
    {typeof (Boolean), "bit"}, 
    {typeof (Byte[]), "varbinary(max)"}, 
    {typeof (Double), "float"}, 
    {typeof (Byte), "tinyint"}, 
    {typeof (Int16), "smallint"}, 
    {typeof (Int32), "int"}, 
    {typeof (Int64), "bigint"}, 
    {typeof (Decimal), "decimal"}, 
    {typeof (Single), "real"}, 
    {typeof (DateTime), "datetime2(7)"}, 
    {typeof (TimeSpan), "time"}, 
    {typeof (String), "nvarchar(MAX)"}, 
    {typeof (Guid), "uniqueidentifier"} 
}; 

Sonra bir .NET türü geçtiği aşağıda genel bir yöntem var ve bu sözlüğü kullanarak karşılık gelen MS SQL Server türü dize değeri döndürür. Ancak, bu veritabanı sorguları yapmak için bir arama tablosu olarak kullanıldığından, bir ConcurrentDictionary yapmak için mantıklı olduğunu düşünüyorum. Ben bunu değiştirdi.

private static readonly IDictionary<Type, string> SqlServerMap = new ConcurrentDictionary<Type, string> 
{ 
    {typeof (Boolean), "bit"}, 
    {typeof (Byte[]), "varbinary(max)"}, 
    {typeof (Double), "float"}, 
    {typeof (Byte), "tinyint"}, 
    {typeof (Int16), "smallint"}, 
    {typeof (Int32), "int"}, 
    {typeof (Int64), "bigint"}, 
    {typeof (Decimal), "decimal"}, 
    {typeof (Single), "real"}, 
    {typeof (DateTime), "datetime2(7)"}, 
    {typeof (TimeSpan), "time"}, 
    {typeof (String), "nvarchar(MAX)"}, 
    {typeof (Guid), "uniqueidentifier"} 
}; 

Ama şimdi {} (ConcurrentDictionary yani tüm anahtar değer çiftleri) içinde kırmızı herşeyi altını çizer ve hata burada 'Ekle' özel yöntemine erişilemiyor" dir Bilmiyorum ben sadece kamu statik versiyonunu yaparak test çünkü özel statik salt okunur olarak başlatılamıyor çünkü olduğunu düşünüyorum ve ben aynı hatayı alıyorum.

cevap

10

Eğer koleksiyonunu doldurmak için kullandığınız koleksiyon başlatıcı sadece toplama sahiptir çalışıp çalışmadığını Uygun bir imza ve erişilebilirlik için Add yöntemidir ConcurrentDictionary, herkese açık Add yöntemine sahip değildir, dolayısıyla bir koleksiyon ilklendirmesi kullanamazsınız onunla birlikte.

Yapıcı için bir parametre olarak bir IEnumerable<KeyValuePair<TKey, TValue>> geçerek bir ilk veri sağlayabilir veya ConcurrentDictionary oluşturduktan sonra bir döngüde (adına Add diğer yöntemleri ya da AddOrUpdate, ya da herhangi bir) TryAdd çağırabilir.

+0

Ah tamam, teşekkürler. Keşke daha önce statik bir ConcurrentDictionary içinde başlatılmış olsaydım, çünkü değişmeyeceğini biliyorum ve sadece hızlı bir şekilde erişmek istiyorum. Ama ne yapabilirim göreceğim. – Drew

+0

@Drew Ve koleksiyon koleksiyonlayıcısı kullanmak yerine 'IEnumerable'ını yapıcıya geçirebilirsiniz. – Servy

+0

Ohh Cevabınızda ne kastettiğinizi yanlış anladım, teşekkürler! – Drew

0

Yanıtında @Servy dediği gibi, koleksiyon ilklendirme Add yöntemiyle çalışır. Ancak, Add adı ile uzantı yöntemi ve uygun imza varsa, bu da çalışmalıdır. Böylece eşzamanlı sözlük için bir tane oluşturabilirsiniz. Statik alan başlatıcısı kullandığınız için, başlatma işlemi thread-safe olacaktır.

5

Eğer kurucusuna KeyValuePair tiplerinin (a List gibi) IEnumerable impements bir tür geçebilir, bir ConcurrentDictionary örnekleme de başlatmak amacıyla, Servy kabul ettiği cevabı bir kod örnek olarak bu

private static readonly IDictionary<Type, string> SqlServerMap = new ConcurrentDictionary<Type, string>(new Dictionary<Type, string>() 
{ 
    {typeof (Boolean), "bit"}, 
    {typeof (Byte[]), "varbinary(max)"}, 
    {typeof (Double), "float"}, 
    {typeof (Byte), "tinyint"}, 
    {typeof (Int16), "smallint"}, 
    {typeof (Int32), "int"}, 
    {typeof (Int64), "bigint"}, 
    {typeof (Decimal), "decimal"}, 
    {typeof (Single), "real"}, 
    {typeof (DateTime), "datetime2(7)"}, 
    {typeof (TimeSpan), "time"}, 
    {typeof (String), "nvarchar(MAX)"}, 
    {typeof (Guid), "uniqueidentifier"} 
}); 
0

deneyin :

private static readonly IDictionary<Type, string> SqlServerMap = 
    new ConcurrentDictionary<Type, string>(
     new List<KeyValuePair<Type, string>> 
     { 
      new KeyValuePair<Type, string>(typeof(Boolean), "bit"), 
      new KeyValuePair<Type, string>(typeof(Boolean), "bit"), 
      new KeyValuePair<Type, string>(typeof(Byte[]), "varbinary(max)"), 
      new KeyValuePair<Type, string>(typeof(Double), "float"), 
      new KeyValuePair<Type, string>(typeof(Byte), "tinyint"), 
      new KeyValuePair<Type, string>(typeof(Int16), "smallint"), 
      new KeyValuePair<Type, string>(typeof(Int32), "int"), 
      new KeyValuePair<Type, string>(typeof(Int64), "bigint"), 
      new KeyValuePair<Type, string>(typeof(Decimal), "decimal"), 
      new KeyValuePair<Type, string>(typeof(Single), "real"), 
      new KeyValuePair<Type, string>(typeof(DateTime), "datetime2(7)"), 
      new KeyValuePair<Type, string>(typeof(TimeSpan), "time"), 
      new KeyValuePair<Type, string>(typeof(String), "nvarchar(MAX)"), 
      new KeyValuePair<Type, string>(typeof(Guid), "uniqueidentifier") 
     }); 
İlgili konular