2017-03-07 103 views
0

給構造器,我需要一個嵌套類傳遞到另一個ViewModel誰擁有的構造是這樣的:通嵌套類使用反射

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

從那裏我得到的數據是CityListViewModel和它的類是嵌套CityInfo

詳細說明。 我有一個datagrid其項目類型爲CityInfo。那麼,當我從datagrid中選擇該項目時,它應該打開新的ViewModel誰是CitiyEditViewModel(它應該將該類發送給我的構造函數上面)。

我曾嘗試以下操作:

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

但我得到的方法不存在例外。

+2

EditClass.GetConstructors()返回什麼? –

+1

什麼是「ChildClass」?它如何依賴於'CityListViewModel.CityInfo'? – HimBromBeere

+0

你在哪裏傳遞構造函數參數? –

回答

0

在這一行,你要調用構造函數CityEditViewModel(CityEditViewModel.CityInfo)

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

That overload of CreateInstance需要一個或多個參數。第一個是要構建的類的Type。第二個參數和後續參數是您希望它傳遞給構造函數的參數。它使用反射來按照該順序查找與該組參數匹配的構造函數。如果它找到一個,它會調用它來創建該類型的一個實例。

您正在傳遞ConstructorInfo類型的構造函數參數。 CityEditViewModel沒有帶有該類型參數的構造函數。該方法不存在。因此例外。我得到System.MissingMethodException,消息爲"Constructor on type 'CityEditViewModel' not found."。如果它表明某些特定的構造函數沒有找到,但是我看起來更糟糕,該消息會更好。

通過它CityEditViewModel.CityInfo代替:

var cityInfo = whateverThingUserClickedOn as CityEditViewModel.CityInfo; 

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

但是,演員陣容爲您的利益,而不是Activator.CreateInstance()。構造函數的參數是object,所以它不需要投:

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

並刪除此下一行;你不需要它。 Activator.CreateInstance()根據您提供的參數類型找到您的構造函數。

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

我正在發送'Type'和對象,但是有一個小錯誤。 我在調試器中檢查我的'SelectedItem',它顯示它來自類類型'CityListViewModel + CityInfo'。我修改了'+'會重現一個錯誤,所以我將它改爲點(。)... 現在,在不修改「SelectedItem」後,它可以很好地工作。 – FiN

+0

不修改SelectedItem?不確定你的意思,但如果它起作用,它就會起作用。 –