2017-03-07 61 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?不确定你的意思,但如果它起作用,它就会起作用。 –