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