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

Foi útil?

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");

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top