Domanda

Sto usando (una versione leggermente estesa del) il seguente codice in una funzione stile fabbrica-modello:

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

tuttavia, getta una constuctor non trovata eccezione quando correre, e non riesco a capire perché.

Il metodo data.Case.ToString () restituisce il nome di una classe, SingleItemNew, che ha un costruttore di prendere un singolo argomento.

Qualcuno ha idea di quale sia il problema?

Saluti, Ed

È stato utile?

Soluzione

Prova questo:

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

La ragione per cui codice non funziona è che Activator.CreateInstance in realtà non hanno il sovraccarico che si desidera. Così si potrebbe chiedere perché il codice viene compilato a tutti! La ragione è, ha un overload che accetta (Type type, params object[] args) cui corrisponde la chiamata metodo in modo che compila, ma in fase di esecuzione, si cerca il vostro tipo per un costruttore di prendere una BindingFlags e un BookingContext[] che non è chiaramente che cosa il vostro tipo ha.

Altri suggerimenti

è il pubblico costruttore?

è il singolo parametro di tipo BookingContext?

Il problema è che questo è chiaramente parte di un sistema più grande - che sarebbe stato molto più facile per aiutarti se si potesse produrre un breve ma completa programma che ha dimostrato il problema. Allora potremmo risolvere il problema in quel programma, e si potrebbe porta il fix di nuovo al vostro sistema reale. Otherwisewise siamo davvero solo indovinare: (

Il costruttore SingleItemNew prendere BookingContext come parametro? Se esso non corrisponde exatcly fallirà:

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

Questo ha funzionato per me.

Type.GetType ( "namespace.class, namespace");

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top