Frage

Ich benutze (eine etwas erweiterte Version) den folgenden Code in einer Fabrik-Muster Style-Funktion:

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

aber es wirft ein Konstruktor nicht Ausnahme gefunden, wenn laufen, und ich kann nicht herausfinden, warum.

Die data.Case.ToString () Methode gibt den Namen einer Klasse, SingleItemNew, die einen Konstruktor hat ein einziges Argument nehmen.

Hat jemand eine Idee, was das Problem ist?

Cheers, Ed

War es hilfreich?

Lösung

Versuchen Sie dieses:

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

Der Grund, warum Sie Code nicht funktioniert, ist, dass Activator.CreateInstance haben nicht wirklich die Überlastung Sie wollen. So könnte man sich fragen, warum der Code überhaupt kompiliert! Der Grund dafür ist, es eine Überlastung hat die (Type type, params object[] args) nimmt die Ihren Methodenaufruf übereinstimmt, so dass es aber zur Laufzeit kompiliert, sucht Ihre Art für einen Konstruktor ein BindingFlags und BookingContext[] nehmen, die eindeutig nicht, was Ihre Art hat.

Andere Tipps

Ist der Konstruktor public?

Sind die einzelnen Parameter des Typ BookingContext?

Das Problem ist, das ist eindeutig Teil eines größeren Systems - es wäre viel leichter, Ihnen zu helfen, wenn Sie ein kurze, aber vollständige Programm , die das Problem demonstriert. Dann könnten wir das Problem in diesem Programm beheben, und Sie könnten Port Ihre fix zurück zu Ihrem realen System. Otherwisewise wir vermuten, dass wirklich nur: (

Hat der SingleItemNew Konstruktor BookingContext als Parameter nehmen? Wenn es nicht exatcly übereinstimmen wird es fehlschlagen:

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

Das funktioniert für mich.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top