C# 当类型(…)具有构造函数时,找不到该类型的构造函数
我试图找到所有具有自定义属性ToolTestAttribute的类,并实例化该类的一个实例。当代码尝试运行构造函数时,它报告找不到构造函数类型 我要开始的课程是这样的:C# 当类型(…)具有构造函数时,找不到该类型的构造函数,c#,reflection,C#,Reflection,我试图找到所有具有自定义属性ToolTestAttribute的类,并实例化该类的一个实例。当代码尝试运行构造函数时,它报告找不到构造函数类型 我要开始的课程是这样的: public AllComponentsConstrained(ITool toolFile) { tool = toolFile; } List<object> StartTests(Assembly assem, ITool tool) {
public AllComponentsConstrained(ITool toolFile)
{
tool = toolFile;
}
List<object> StartTests(Assembly assem, ITool tool)
{
List<object> result = new List<object>();
foreach (Type type in assem.GetTypes())
{
if (type.GetCustomAttributes(typeof(ToolTestAttribute), true).Length > 0)
{
List<ITool> args = new List<ITool>();
args.Add(tool);
result.Add(Activator.CreateInstance(type, args));
}
}
return result;
}
查找具有所需属性的类的代码如下所示:
public AllComponentsConstrained(ITool toolFile)
{
tool = toolFile;
}
List<object> StartTests(Assembly assem, ITool tool)
{
List<object> result = new List<object>();
foreach (Type type in assem.GetTypes())
{
if (type.GetCustomAttributes(typeof(ToolTestAttribute), true).Length > 0)
{
List<ITool> args = new List<ITool>();
args.Add(tool);
result.Add(Activator.CreateInstance(type, args));
}
}
return result;
}
我的参数列表有一个正确类型的元素。
这里可能有什么问题?您正在调用重载
这需要传递构造函数参数的对象数组。您的构造函数需要一个ITool,但您试图将列表作为第一个参数传递
或者:
Activator.CreateInstance(type, tool)
或:
你在叫超载
这需要传递构造函数参数的对象数组。您的构造函数需要一个ITool,但您试图将列表作为第一个参数传递
或者:
Activator.CreateInstance(type, tool)
或:
不接受列表参数,但接受数量可变的对象params object[]
因此,您的代码尝试调用一个构造函数,该构造函数接受一个不存在的列表
将其更改为:Activator.CreateInstancetype,tool不接受列表参数,而是接受数量可变的对象params object[]
因此,您的代码尝试调用一个构造函数,该构造函数接受一个不存在的列表
将其更改为:Activator.CreateInstancetype,tool您正在使用的CreateInstance方法采用类型和参数对象[];因为你给它一个列表而不是数组,你本质上是说找到一个具有列表参数的构造函数
请尝试:
object[]args=新对象[]{tool};
result.AddActivator.CreateInstancetype,args;
或者更简单,让编译器来处理它:
result.AddActivator.CreateInstancetype,工具;
您正在使用的CreateInstance方法接受一个类型和一个params对象[];因为你给它一个列表而不是数组,你本质上是说找到一个具有列表参数的构造函数
请尝试:
object[]args=新对象[]{tool};
result.AddActivator.CreateInstancetype,args;
或者更简单,让编译器来处理它:
result.AddActivator.CreateInstancetype,工具;
您将列表作为第一个参数传递,而不是ITool。请尝试以下方法:
Activator.CreateInstance(type, tool);
您正在调用的CreateInstance重载是一个params对象[]args,因此您正在尝试将List作为第一个参数传递。您将List作为第一个参数传递,而不是ITool。请尝试以下方法:
Activator.CreateInstance(type, tool);
您正在调用的CreateInstance重载是一个params对象[]args,因此您所做的是尝试将List作为第一个参数传递。我想我会给出第一张海报的答案,因为四张海报都说了相同的基本内容。所以我抓到了错误的激活器。实例重载。因此,如果我有一个接受多个参数的构造函数,我想我会使用数组?@EricSnyder你抓住了正确的重载-你只是错过了不能传递参数列表的机会。要么一个接一个地传递参数,而不使用数组或列表等包装参数,要么传递参数的对象[]。Activator.CreateInstance不知道如何解释论点列表我想我会给出第一张海报的答案,因为四张海报都说了相同的基本内容。所以我抓到了错误的激活器。实例重载。因此,如果我有一个接受多个参数的构造函数,我想我会使用数组?@EricSnyder你抓住了正确的重载-你只是错过了不能传递参数列表的机会。要么一个接一个地传递参数,而不使用数组或列表等包装参数,要么传递参数的对象[]。Activator.CreateInstance不知道如何解释参数列表