Activator.CreateInstance(t, 42, args) не может найти конструктор
-
13-09-2019 - |
Вопрос
Я использую (слегка расширенную версию) следующий код в функции стиля фабричного шаблона:
публичный класс 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("пространство имен.класс, пространство имен");