Вопрос

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

публичный класс SingleItemNew:CACKOUTCONTEXT {Public BookingContext Data {get;набор;} public SingleTemnew (BookingContext Data) {data = data;}} public CakeOutContext findContext (BookingContext Data) {type contextType = type.getType ("CakeOutProcesses." + Data.Cale.toString ());CACKOUTCONTEXT OUTPUT = ACTIVETOR.CREATEINSTANCE (ContextType, BindingFlags.createInstance, new [] {data}) как cakeoutContext;обратный вывод;}

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

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

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

Приветствую, Эд

Это было полезно?

Решение

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

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

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

Другие советы

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

Единственный параметр типа BookingContext?

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

Принимает ли конструктор 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 });

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

Type.GetType("пространство имен.класс, пространство имен");

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top