Activator.CreateInstance (t, 42, args) não consegue encontrar construtor
-
13-09-2019 - |
Pergunta
Eu estou usando (uma versão ligeiramente prolongado de) o seguinte código em uma função de estilo de fábrica-padrão:
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;
}
No entanto, ele lança uma exceção constuctor não encontrado quando executado, e eu não consigo descobrir o porquê.
O data.Case.ToString () retorna o nome de uma classe, SingleItemNew, que tem um construtor que toma um único argumento.
Alguém tem alguma idéia de qual é o problema?
Cheers, Ed
Solução
Tente esta:
Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
CheckoutContext output =
(CheckoutContext)Activator.CreateInstance(contextType, data);
A razão que você código não funciona é que Activator.CreateInstance
realmente não tem a sobrecarga que quiser. Então você pode perguntar por que o código compila em tudo! A razão é, ele tem uma sobrecarga que leva (Type type, params object[] args)
que corresponde à sua chamada de método para que ele compila mas em tempo de execução, ele procura seu tipo para um construtor tomar um BindingFlags
e uma BookingContext[]
que não é claramente o seu tipo tem.
Outras dicas
É o público construtor?
É o único parâmetro do tipo BookingContext
?
O problema é que este é claramente parte de um sistema maior - que seria muito mais fácil para ajudá-lo se você pudesse produzir um curto, mas completo programa que demonstrou o problema. Então poderíamos resolver o problema nesse programa, e você poderia porta a sua correção de volta para o sistema real. Otherwisewise nós realmente estamos apenas supondo: (
O construtor SingleItemNew tomar BookingContext como parâmetro? Se ele não corresponder exatcly ele irá falhar:
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 });
Isso funcionou para mim.
Type.GetType ( "namespace.class, namespace");