Я использую (немного расширенную версию) следующий код в функции стиля 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, у которого есть конструктор, принимающий один аргумент.
Кто-нибудь знает, в чем проблема?
Приветствия, Эд
Попробуйте следующее:
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
?
Проблема в том, что это явно часть более крупной системы - было бы намного проще помочь вам, если бы вы могли создать короткую, но полную программу, которые продемонстрировали эту проблему. Тогда мы могли бы исправить проблему в этой программе, и вы могли бы перенести свое исправление обратно в свою реальную систему. Кроме того, мы действительно просто догадываемся: (
Это сработало для меня.
Type.GetType( "namespace.class, namespace" );
Создает ли конструктор 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 });