Activator.CreateInstance (t, 42, args) не может найти конструктор - PullRequest
2 голосов
/ 11 июня 2009

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

<code></p>

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

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

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

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

Cheers, Ed

Ответы [ 4 ]

7 голосов
/ 11 июня 2009

Попробуйте это:

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

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

1 голос
/ 11 июня 2009

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

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

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

0 голосов
/ 08 сентября 2009

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

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

0 голосов
/ 11 июня 2009

Принимает ли конструктор SingleItemNew BookingContext в качестве параметра? Если он не совпадает точно, он потерпит неудачу:

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