我正在尝试查找具有自定义属性“ ToolTestAttribute”的所有类,并实例化该类的实例。当代码尝试运行构造函数时,它报告未找到构造函数类型。
我正在尝试上的课看起来像这样:
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;
}
ToolTestAttribute代码:
using System;
using System.Reflection;
namespace Sharpline.SL24.ToolingAddIn.Attributes
{
[AttributeUsage(AttributeTargets.Class)]
class ToolTestAttribute : Attribute
{
public string Target;
public string Name;
public ToolTestAttribute(string testTarget, string testName)
{
Target = testTarget;
Name = testName;
}
}
}
我的参数列表只有一个正确类型的元素。 这里可能出什么问题了?
答案 0 :(得分:4)
您正在呼叫Activator.CreateInstance(Type, params object[])
重载。
这需要传递构造函数参数的对象数组。您的构造函数期望使用ITool
,但是您试图将List<ITool>
作为第一个参数。
可以:
Activator.CreateInstance(type, tool)
或者:
object[] args = new object[] { tool };
Activator.CreateInstance(type, args);
答案 1 :(得分:2)
您使用的CreateInstance
方法有一个Type
和一个params object[]
;因为您要给它一个 list (不是数组),所以您实际上是在说“找到一个参数为列表的构造函数”。
尝试:
object[] args = new object[] { tool };
result.Add(Activator.CreateInstance(type, args));
或更简单,让编译器处理它:
result.Add(Activator.CreateInstance(type, tool));
答案 2 :(得分:1)
Activator.CreateInstance
不采用List<ITool>
参数,而是可变数量的对象(params object[]
)。
因此,您的代码尝试调用采用List<ITool>
不存在的构造函数。
将其更改为:Activator.CreateInstance(type, tool)
答案 3 :(得分:1)
您将传递List<ITool>
作为第一个参数,而不是ITool
。尝试以下方法:
Activator.CreateInstance(type, tool);
您正在调用的CreateInstance
的重载是params object[] args
,因此您正在尝试将List<ITool>
作为第一个参数传递。