Pregunta

Estoy usando (una versión ligeramente extendida) el siguiente código en una función de estilo de patrón de fábrica:

clase pública SingleItemNew:GIERDOUTCONTEXT {public BookingContext Data {get;colocar;} public singleItemnew (BookingContext Data) {data = data;}} public checkoutContext findContext (BookingContext Data) {type contextType = type.gettype ("checkoutprocesses." + data.case.ToString ());GAWOUTContext output = activator.createInstance (contexttype, bindingflags.createInstance, new [] {data}) como checkoutContext;salida de retorno;}

sin embargo, arroja una excepción de constructor no encontrado cuando se ejecuta y no puedo entender por qué.

El método data.Case.ToString() devuelve el nombre de una clase, SingleItemNew, que tiene un constructor que toma un único argumento.

¿Alguien tiene alguna idea de cuál es el problema?

Saludos, Ed

¿Fue útil?

Solución

Prueba con esto:

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

La razón por la que El código no funciona es que Activator.CreateInstance realmente no tiene la sobrecarga que desea. Así que es posible preguntarse por qué el código se compila en absoluto! La razón es, tiene una sobrecarga que lleva (Type type, params object[] args) que coincide con su llamada al método por lo que compila pero en tiempo de ejecución, que busca en su tipo para un constructor que toma un BindingFlags y una BookingContext[] que claramente no es lo que su tipo tiene.

Otros consejos

¿El constructor es público?

Es el único parámetro de tipo. BookingContext?

El problema es que esto es claramente parte de un sistema mayor: sería mucho sería más fácil ayudarle si pudiera producir un programa corto pero completo lo que demostró el problema.Entonces podríamos solucionar el problema en ese programa y usted podría trasladar la solución a su sistema real.De lo contrario, en realidad solo estamos adivinando :(

¿El constructor SingleItemNew tomar BookingContext como parámetro? Si no coincide exatcly se producirá un error:

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

Esto funcionó para mí.

Type.GetType ( "namespace.class, espacio de nombres");

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top