Activator.CreateInstance (t, 42, args) не может найти конструктор

2

Я использую (немного расширенную версию) следующий код в функции стиля factory -pattern:



public class SingleItemNew : CheckoutContext { public BookingContext Data { get; set; } public SingleItemNew(BookingContext data) { Data = data; } } public CheckoutContext findContext(BookingContext data) { Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString()); CheckoutContext output = Activator.CreateInstance(contextType, BindingFlags.CreateInstance, new[] { data }) as CheckoutContext; return output; }

однако он выдает исключение constuctor не найденное исключение при запуске, и я не могу понять, почему.

Метод data.Case.ToString() возвращает имя класса SingleItemNew, у которого есть конструктор, принимающий один аргумент.

Кто-нибудь знает, в чем проблема?

Приветствия, Эд

Теги:
types
activator

4 ответа

7
Лучший ответ

Попробуйте следующее:

  Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
  CheckoutContext output = 
      (CheckoutContext)Activator.CreateInstance(contextType, data);

Причина, по которой вы код не работает, заключается в том, что Activator.CreateInstance действительно не имеет требуемой перегрузки. Поэтому вы можете задаться вопросом, почему код вообще компилируется! Причина в том, что она имеет перегрузку, которая принимает (Type type, params object[] args), которая соответствует вызову метода, который он компилирует, но во время выполнения он ищет ваш тип для конструктора с BindingFlags и BookingContext[], который явно не соответствует вашему типу.

  • 0
    на месте, я, очевидно, не должен читать страницы документации для классов, они лгут! (Документ для Activator.CreateInstance говорит вам использовать (type, object [] params) для вызова конструктора с соответствующим количеством аргументов внутри params!) = D
  • 0
    Это не ложь. Он говорил вам указывать BindingFlags, если он вам действительно не нужен? ;)
Показать ещё 4 комментария
1

Является ли конструктор общедоступным?

Является единственным параметром типа BookingContext?

Проблема в том, что это явно часть более крупной системы - было бы намного проще помочь вам, если бы вы могли создать короткую, но полную программу, которые продемонстрировали эту проблему. Тогда мы могли бы исправить проблему в этой программе, и вы могли бы перенести свое исправление обратно в свою реальную систему. Кроме того, мы действительно просто догадываемся: (

  • 0
    Смысл взят, я обновлю пост.
0

Это сработало для меня.

Type.GetType( "namespace.class, namespace" );

0

Создает ли конструктор SingleItemNew параметр BookingContext в качестве параметра? Если он не соответствует exatcly, это не сработает:

class ParamType   {    }
class DerivedParamType : ParamType    {    }
class TypeToCreate
{
    public TypeToCreate(DerivedParamType data)
    {
        // do something
    }
}

ParamType args = new ParamType();
// this call will fail: "constructor not found"
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

// this call would work, since the input type matches the constructor
DerivedParamType args = new DerivedParamType();
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню