Конструктор типа (...) не найден, если этот тип имеет конструктор - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь найти все классы с настраиваемым атрибутом «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;
        }

    }
}

Мой список аргументов содержит один элемент правильного типа. Что здесь может быть не так?

Ответы [ 4 ]

4 голосов
/ 13 марта 2020

Вы вызываете перегрузку Activator.CreateInstance(Type, params object[]).

Для этого требуется массив объектов параметров конструктора для передачи. Ваш конструктор ожидает ITool, но вы пытаетесь передать List<ITool> в качестве первого параметра.

Либо выполните:

Activator.CreateInstance(type, tool)

Или:

object[] args = new object[] { tool };
Activator.CreateInstance(type, args);
2 голосов
/ 13 марта 2020

Используемый метод CreateInstance принимает значения Type и params object[]; так как вы предоставляете ему список (не массив), вы, по сути, говорите: «найдите конструктор с параметром, который является списком ».

попробуйте вместо этого:

object[] args = new object[] { tool };
result.Add(Activator.CreateInstance(type, args));

или, возможно, проще, пусть компилятор справится с этим:

result.Add(Activator.CreateInstance(type, tool));
1 голос
/ 13 марта 2020

Вы передаете List<ITool> в качестве первого параметра, а не ITool. Попробуйте вместо этого:

Activator.CreateInstance(type, tool);

Перегрузка CreateInstance, которую вы вызываете, является params object[] args, поэтому вы пытались передать List<ITool> в качестве первого параметра.

1 голос
/ 13 марта 2020

Activator.CreateInstance принимает не аргумент List<ITool>, а переменное число объектов (params object[]).

Таким образом, ваш код пытается вызвать конструктор, который принимает List<ITool> который не существует.

Измените его на: Activator.CreateInstance(type, tool)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...