2014-08-29 7 views
14

İstisna mesajı: Constructor on type StateLog not found.Oluşturucu türü bulunamadı

Ben sadece bir sınıf için çalışmıyor Aşağıdaki kodu vardır:

 List<T> list = new List<T>(); 
     string line; 
     string[] lines; 

     HttpWebResponse resp = (HttpWebResponse)HttpWebRequest.Create(requestURL).GetResponse(); 

     using (var reader = new StreamReader(resp.GetResponseStream())) 
     { 
      while ((line = reader.ReadLine()) != null) 
      { 
       lines = line.Split(splitParams); 
       list.Add((T)Activator.CreateInstance(typeof(T), lines)); 
      } 
     } 

onun için çalışmıyor sınıfının yapıcı tam olarak çalıştığı için diğer sınıfların gibidir. Tek fark, bu sınıfın 2-5 yerine 16 argümandan geçmesidir. gibi yapıcı görünür: Dediğim gibi

public StateLog(string[] line) 
    { 
     try 
     { 
      SessionID = long.Parse(line[0]); 
      AgentNumber = int.Parse(line[1]); 
      StateIndex = int.Parse(line[5]); 
      .... 
     } 
     catch (ArgumentNullException anex) 
     { 
      .... 
     } 
    } 

, bu kullanan diğer 5 sınıflar için çalışır, tek fark girişlerinin sayısıdır.

+1

:

Tabii
var parameters = new object[1]; parameters[0] = lines; Activator.CreateInstance(typeof(T), parameters) 

, sadece bir satır içi dizisi başlatıcı kullanabilirsiniz Daha ciddi bir notta, belki de nasıl çalışmadığını bize anlatmak için biraz zaman ayırmalısınız. Hata mesajları? – spender

+0

'StateLog' sınıfı bu kapsamdan görülebilir mi? Ek kurucu aşırı yüklenme var mı? – Groo

+0

Soru başlığı için hata mesajının olması, konuyu tahmin etmek için yeterli olacağını düşündüm. Güncellenecek. – JRLambert

cevap

32

Bu, yapıcı parametrelerinin bir listesini içermesi gereken bir nesne dizisini kabul eden Activator.CreateInstance overload kullanıyor olmanızdır. Diğer bir deyişle, bir tanesi yerine 16 parametresi olan StateLog yapıcı aşırı yükünü bulmaya çalışıyor. Bu array covariance nedeniyle derler.

Yani derleyici bu ifadeyi gördüğünde: lines beri

Activator.CreateInstance(typeof(T), lines) 

bir string[], bu bunu derleyici aslında böyle görüyor, yani otomatik olarak object[] için döküm olması kovaryans güvenmek istiyorum varsaymaktadır Bu:

Activator.CreateInstance(typeof(T), (object[])lines) 

yöntem daha sonra lines.Length eşit parametreler, tip string tümünün bir numarası olan bir yapıcı bulmaya çalışır. Örneğin

, bu Kurucular varsa:

Activator.CreateInstance(typeof(StateLog), new string[] { "a", "b", "c" }) yerine bir ilk, ikinci yapıcısı (üç parametrelerle bir) arayacak çağrılması
class StateLog 
{ 
     public StateLog(string[] line) { ... } 
     public StateLog(string a, string b, string c) { ... } 
} 

. Eğer gerçekten istediğiniz ne

etkili ilk dizi öğe olarak tüm lines diziyi geçmektir:

list.Add((T)Activator.CreateInstance(typeof(T), new object[] { lines })); 
+0

O zaman yapıcı parametresi olarak string [] 'i kabul eden diğer sınıflarım için nasıl çalışır? – JRLambert

+0

Bu sınıflar, daha fazla parametre kabul eden farklı ctor aşırı yüklerine sahip mi? Bunun için pek bir şey yoktur, yöntem sadece eşleşen bir kurucu arar (parametrelerin sayısı ve türlerinin eşleşmesi gerekir). – Groo

+0

Evet, ama bu da öyle. – JRLambert