使用反射将嵌套类传递给构造函数

时间:2017-03-07 15:01:16

标签: c# wpf

我需要将一个嵌套类传递给另一个具有如下构造函数的<div class="image-holder"> <div class="offer-image offer-1"> <div class="overlay-black"></div> <h2 class="offer-image-title">Chuck Norris</h2> </div> </div>

ViewModel

我从中获取数据的类是 public CityEditViewModel(CityListViewModel.CityInfo info) { Model = Library.CityEdit.GetItem(info.Model.CityID); } ,其中是一个嵌套的类CityListViewModel

详情。 我有一个CityInfo,其项目类型为datagrid。好吧,当我从CityInfo中选择该项时,它应该打开datagrid的新ViewModel(它应该将该类发送到我上面的构造函数)。

我试过以下:

CitiyEditViewModel

但是我得到的方法不存在异常。

1 个答案:

答案 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