2017-03-07 1 views
0

Ich brauche eine verschachtelte Klasse in einer anderen ViewModel spiele Konstruktor wie diese hat:Pässe verschachtelte Klasse Konstruktor mithilfe von Reflektion

public CityEditViewModel(CityListViewModel.CityInfo info) 
     { 
      Model = Library.CityEdit.GetItem(info.Model.CityID); 
     } 

Die Klasse, von wo ich bin immer Daten CityListViewModel und es ist ein verschachtelte Klasse .

Im Detail. Ich habe eine datagrid, deren Artikel vom Typ CityInfo sind. Nun, wenn ich dieses Element von datagrid auswähle, sollte es öffnen ViewModel Wer ist CitiyEditViewModel (Es sollte diese Klasse zu meinem Konstruktor oben senden).

ich folgende habe versucht:

Type EditClass = GetMyClass(subClass); //getting my CityEditViewModel 
ConstructorInfo editConstructor = EditClass.GetConstructor(new Type[] { ChildClass }); // getting the constructor of that class 
IScreen screen = (IScreen)(Activator.CreateInstance(EditClass, editConstructor)); //this part activates the window 


    //GetMyClass method 
    public Type GetMyClass(string type) 
    { 
     return Type.GetType(type); 
    } 

Aber ich bekomme Methode existiert nicht Ausnahme.

+2

Was gibt 'EditClass.GetConstructors()' zurück? –

+1

Was ist 'ChildClass'? Wie ist es auf 'CityListViewModel.CityInfo' angewiesen? – HimBromBeere

+0

Wo übergeben Sie den Konstruktorparameter? –

Antwort

0

In dieser Zeile Sie versuchen CityEditViewModel(CityEditViewModel.CityInfo) den Konstruktor zu nennen:

IScreen screen = (IScreen)(Activator.CreateInstance(EditClass, 
    editConstructor)); 

That overload of CreateInstance nehmen einen oder mehrere Parameter. Die erste ist die Type der zu konstruierenden Klasse. Der zweite und folgende Parameter sind die Parameter, die Sie an den Konstruktor übergeben möchten. Es verwendet Reflektion, um einen Konstruktor zu finden, der diesem Parametersatz in dieser Reihenfolge entspricht. Wenn es eins findet, ruft es es auf, eine Instanz des Typs zu erstellen.

Sie übergeben einen Konstruktorparameter vom Typ ConstructorInfo. CityEditViewModel hat keinen Konstruktor, der einen Parameter dieses Typs akzeptiert. Diese Methode existiert nicht. Daher die Ausnahme. Ich bekomme System.MissingMethodException mit einer Nachricht von "Constructor on type 'CityEditViewModel' not found.". Die Nachricht wäre besser, wenn es angezeigt würde, dass einige bestimmte Konstruktor nicht gefunden wurde, aber ich habe schlimmer gesehen.

Pass es CityEditViewModel.CityInfo statt:

var cityInfo = whateverThingUserClickedOn as CityEditViewModel.CityInfo; 

IScreen screen = (IScreen)(Activator.CreateInstance(EditClass, 
    cityInfo)); 

Aber das Guss zu Ihrem Vorteil ist, nicht Activator.CreateInstance(). Die Konstruktorparameter sind object, so dass es nicht braucht die Besetzung:

IScreen screen = (IScreen)(Activator.CreateInstance(EditClass, 
    whateverThingUserClickedOn)); 

und löschen Sie diese nächste Zeile; du brauchst es nicht. Activator.CreateInstance() findet den Konstruktor für Sie basierend auf den Typen der Parameter, die Sie ihm geben.

ConstructorInfo editConstructor = EditClass.GetConstructor(
    new Type[] { ChildClass }); // getting the constructor of that class 
+1

Ich schickte den 'Type' und das Objekt, aber mit einem kleinen Fehler. Ich habe mein 'SelectedItem' im Debugger überprüft, und es zeigte, dass es von der Klassenart' CityListViewModel + CityInfo' kommt. Ich dachte, das '+' würde einen Fehler reproduzieren, also habe ich ihn in Punkt (.) Geändert ... Nun, nachdem ich 'SelectedItem' NICHT verändert habe, funktioniert es perfekt. – FiN

+0

SelectedItem nicht ändern? Nicht sicher, was du meinst, aber wenn es funktioniert, funktioniert es. –

Verwandte Themen