C# 类型而不是实例的集合

C# 类型而不是实例的集合,c#,wpf,C#,Wpf,我有一个viewmodels列表,该列表当前在开始时实例化了所有viewmodels: private observeCollection步骤视图模型 { 得到 { 如果(_stepViewModels==null) _stepViewModels=新的ObservableCollection { 新的AddRemoveCellsViewModel(TemplateRows), 新的ActivateActivateCellsviewmodel(TemplateRows), 新的RotateCel

我有一个viewmodels列表,该列表当前在开始时实例化了所有viewmodels:

private observeCollection步骤视图模型
{
得到
{
如果(_stepViewModels==null)
_stepViewModels=新的ObservableCollection
{
新的AddRemoveCellsViewModel(TemplateRows),
新的ActivateActivateCellsviewmodel(TemplateRows),
新的RotateCellsViewModel(TemplateRows),
新的SetAcquisitionOrderViewModel(TemplateRows),
新名称TemplateViewModel(TemplateRows)
};
返回stepViewModels;
}
}
public ViewModelWithTemplate CurrentStepViewModel=>StepViewModels[StepIndex];
问题是vm是一次性创建的,但我希望它们只在需要时创建,主要是为了让它们拥有最新版本的
TemplateRows

我该怎么做?我的第一个想法是让集合成为一个类型列表,这样我可以在获得每个viewmodel时实例化它,如下所示:

publicViewModelwithTemplateCurrentStepViewModel=>newStepViewModels[StepIndex](TemplateRows);
但在谷歌上搜索一下,我觉得答案更倾向于控制反转和/或虚拟机工厂。我很难找到与某些框架无关的实际有用信息。(Prism等)

您可以使用委托(假设
StepIndex
的类型为
int
templaterrows
的类型为
templaterrowstype
):

//可以将其移动到静态道具:
var stepViewModelsCtorDict=新字典
{
{0,trows=>newaddremovecellsviewmodel(trows)},
{1,trows=>新的ActivateActivateCellsView模型(trows)},
....
};
var结果=StepViewModelsCtrl[StepIndex](TemplateRows);

您可以使用反射和
Activator.CreateInstance
来代替
新建WhateViewModel
?这很好,但我仍然需要类型的集合,而不是类型的实例。“这可能吗?”--可能吗?当然可以。这是软件。如果你能以一种清晰、明确的方式陈述一个问题,并且这个问题严格地与软件本身的工作方式有关,那么它总是“可能的”。询问它是否有用,是没有用的,而且过于宽泛。你试过什么?您具体需要什么帮助?@JonathanTuzman如果您想使用泛型类型,那么您应该使用无参数构造函数并通过属性设置
TemplateRows
。此外,你还应该管理好适当的约束。也就是说,我坦率地质疑你所要求做的事情是否有用。视图模型在其设计上应该是轻量级对象,对于这些对象,实例化任意数量的视图模型都不会有问题。例如,您可以实现某种类型的工厂委托,但这似乎并不能解决任何实际问题,不必要地使代码复杂化,甚至不一定能提高效率。效果非常好!只是它不需要是一本字典:因为
int
s等于索引,所以它可以只是一个列表。@JonathanTuzman很乐意帮忙!我倾向于在这种情况下使用字典,因为它们更通用(StepIndex可能是一个枚举,例如=)
// this can be moved to static prop:
var stepViewModelsCtorDict = new Dictionary<int, Func<TemplateRowsType, ViewModelWithTemplate>>
{
   {0, trows => new AddRemoveCellsViewModel(trows) },    
   {1, trows => new ActivateDeactivateCellsViewModel(trows) },
....
};

var result = stepViewModelsCtorDict[StepIndex](TemplateRows);