C# 找不到类型上的构造函数

C# 找不到类型上的构造函数,c#,constructor,constructor-exception,C#,Constructor,Constructor Exception,异常消息:未找到StateLog类型上的构造函数 我的以下代码不适用于一个类: List<T> list = new List<T>(); string line; string[] lines; HttpWebResponse resp = (HttpWebResponse)HttpWebRequest.Create(requestURL).GetResponse(); using (v

异常消息:
未找到StateLog类型上的构造函数

我的以下代码不适用于一个类:

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

正如我所说,它适用于其他5个使用它的类,唯一的区别是输入的数量。

这是因为您使用的是接受对象数组的,对象数组应该包含构造函数参数列表。换句话说,它试图找到一个
StateLog
构造函数重载,它有16个参数,而不是一个。这是由于

因此,当编译器看到此表达式时:

Activator.CreateInstance(typeof(T), lines)
由于
是一个
字符串[]
,它假定您希望依赖协方差将其自动转换为
对象[]
,这意味着编译器实际上是这样看待它的:

Activator.CreateInstance(typeof(T), (object[])lines)
然后,该方法将尝试查找一个构造函数,该构造函数的参数数量等于
行。长度
,所有类型均为
字符串

例如,如果您有以下构造函数:

class StateLog
{
      public StateLog(string[] line) { ... }
      public StateLog(string a, string b, string c) { ... }
}
调用
Activator.CreateInstance(typeof(StateLog),新字符串[]{“a”、“b”、“c”})
将调用第二个构造函数(具有三个参数的构造函数),而不是第一个构造函数

实际上,您需要将整个
行作为第一个数组项传递给,有效地:

var parameters = new object[1];
parameters[0] = lines;
Activator.CreateInstance(typeof(T), parameters)
当然,您可以简单地使用内联数组初始值设定项:

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

更严肃地说,也许你应该花点时间告诉我们它是如何不起作用的。错误消息?从该作用域中是否可以看到
StateLog
类?它是否有额外的构造函数重载?我认为问题标题有错误消息就足以推断问题。将更新。它发生在的行将使这成为一个更好的问题。依赖调用者来确保数组具有正确的长度,并且在数组中的正确位置包含可解析为正确类型的项,这使得代码容易出错。有一般的,也有危险的。这种做法是危险的。我保证到明天,或者第二天,你会忘记这是怎么回事。任何其他使用此代码的人都将丢失。依我看,将数组作为参数传递是非常危险的。您的构造函数不接受16个字符串[]类型的参数,但只接受一个。那么,对于接受
string[]
作为构造函数参数的其他类,它是如何工作的呢?这些类是否具有接受更多参数的不同的构造函数重载?没有太多的内容,该方法只是寻找一个匹配的构造函数(其中参数的数量及其类型必须匹配)。它有一个重载,可以接受16个
string
parameters:)我明白你现在说的话了。重要的参数数量。如果我睡眠时间超过3小时,我可能会更早地得到这个结果。注意类型不是数组。例如,如果您使用的是Linq,请确保将.ToArray()转换为
list.Add((T)Activator.CreateInstance(typeof(T), new object[] { lines }));