在C#中实现MVVM模式:如果Model对象的确切类型仅在运行时已知,我如何创建ViewModel实例?
我有一个抽象的ModelBase
类和一个抽象的ViewModelBase
类以及几个派生类,例如FirstModel : ModelBase
,SecondModel : ModelBase
等等,以及FirstViewModel : ViewModelBase
,SecondViewModel : ViewModelBase
等。
现在我想实现一个为给定模型对象创建适当视图模型的函数。这些方面的东西:
ViewModelBase CreateViewModel(ModelBase someObject)
{
return new ViewModelBase(someObject);
}
上述代码当然不起作用,因为ViewModelBase
是抽象的。我宁愿创建一个新的FirstViewModel
,SecondViewModel
等等,具体取决于someObject
的类型,只有在运行时才知道。
我将如何实现这一目标?
答案 0 :(得分:1)
static Dictionary<Type, Type> TypeMap = new Dictionary<Type, Type>
{
{typeof(ModelA), typeof(ViewModelA)},
{typeof(ModelB), typeof(ViewModelB)},
{typeof(ModelC), typeof(ViewModelC)}
};
static ViewModelBase CreateViewModel(ModelBase someObject)
{
return Activator.CreateInstance(TypeMap[someObject.GetType()]);
}
答案 1 :(得分:1)
仅仅因为类型安全而允许任何模型与视图模型耦合是不明智的。例如,如果您的视图模型需要Genre
,而是在运行时获得public class ViewModel<TModel> : ViewModelBase
where TModel : ModelBase
{
public TModel Model { get; protected set; }
public ViewModel(TModel model)
{
Model = model;
}
...
}
,那么视图模型如何使用此模型进行操作?
也许我完全错过了您的要求,但您可以使用通用视图模型库:
public class MovieViewModel : ViewModel<Movie>
{
...
}
public class GenreViewModel : ViewModel<Genre>
{
...
}
然后,您可以根据映射创建视图模型。例如:
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb