Question

J'utilise (une version légèrement prolongée) le code suivant dans une fonction de style de modèle d'usine:

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

cependant, il jette un constuctor ne se trouve pas exception lorsqu'il est exécuté, et je ne peux pas comprendre pourquoi.

La méthode data.Case.ToString () retourne le nom d'une classe, SingleItemNew, qui a un constructeur prendre un seul argument.

Est-ce que quelqu'un a une idée ce que le problème est?

Cheers, Ed

Était-ce utile?

La solution

Essayez celui-ci:

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

La raison pour laquelle votre code ne fonctionne pas est que Activator.CreateInstance n'a pas vraiment la surcharge que vous voulez. Alors, on peut se demander pourquoi le code compile du tout! La raison en est, il a une surcharge qui prend (Type type, params object[] args) qui correspond à votre appel de méthode il compile, mais lors de l'exécution, il recherche le type pour un constructeur de prendre un BindingFlags et un BookingContext[] qui est clairement pas ce que votre type a.

Autres conseils

Le public est-constructeur?

est le seul paramètre de type BookingContext?

Le problème est, ce qui est manifestement partie d'un plus grand système - il serait beaucoup plus facile pour vous aider si vous pouviez produire un court mais programme complet qui a démontré le problème. Ensuite, nous pourrions résoudre le problème dans ce programme, et vous pouvez transférer votre solution à votre système réel. Otherwisewise nous sommes vraiment juste deviner: (

Le constructeur prend SingleItemNew BookingContext en tant que paramètre? Si elle ne correspond pas à exatcly il échouera:

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

Cela a fonctionné pour moi.

Type.GetType ( "namespace.class, espace de noms");

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top