我从名为 MVVM RI 的 PRISM 示例中复制了一个代码,在这个工厂中有一个Dictionary<Type, Func<Question, QuestionViewModel>>
用于映射的代码。这里是:
/// <summary>
/// Factory class to create a question view model for a given question object.
/// </summary>
private static class QuestionViewModelFactory
{
private static Dictionary<Type, Func<Question, QuestionViewModel>> maps = new Dictionary<Type, Func<Question, QuestionViewModel>>()
{
{ typeof(OpenQuestion), (q) => new OpenQuestionViewModel((OpenQuestion)q) },
{ typeof(MultipleSelectionQuestion), (q) => new MultipleSelectionQuestionViewModel((MultipleSelectionQuestion)q) },
{ typeof(NumericQuestion), (q) => new NumericQuestionViewModel((NumericQuestion)q) }
};
public static QuestionViewModel GetViewModelForQuestion(Question question)
{
Func<Question, QuestionViewModel> viewModelInstanceFactory = null;
if (maps.TryGetValue(question.GetType(), out viewModelInstanceFactory))
{
return viewModelInstanceFactory(question);
}
else
{
throw new ArgumentOutOfRangeException("Could not locate a view model for question type");
}
}
}
请注意,每个派生类都QuestionViewModel
需要创建一个构造函数参数。
public abstract class QuestionViewModel : NotificationObject
{
protected QuestionViewModel() { ... }
}
public abstract class QuestionViewModel<T> : QuestionViewModel
where T : Question
{
protected QuestionViewModel(T question) { ... }
}
但是现在,我需要通过发现来拥有这个工厂(因为我没有参考,这些在不同的模块中)。我在想像在开始时创建一个新的自定义属性,但后来我说:我怎样才能将参数传递给构造函数?
我将创建数百个相同数据类型的问题,这就是为什么[Import]
行不通的原因(我猜)。