我正在与 MEF 合作。我正在观看来自 PRISM 的名为 MVVM RI 的演示,该程序的一部分具有以下代码:
/// <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");
}
}
}
// Note that each class derived QuestionViewModel needs a constructor parameter to be created.
public abstract class QuestionViewModel : NotificationObject
{
protected QuestionViewModel() { ... }
}
public abstract class QuestionViewModel<T> : QuestionViewModel
where T : Question
{
protected QuestionViewModel(T question) { ... }
}
在我的软件中,我需要这个功能,但现在我想通过发现来完成。
一开始,我正在考虑创建一个自定义导出以仅存储QuestionViewModel
并存储为contractName
问题类型模型。检查这个。
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ExportViewModelForProblemAttribute : ExportAttribute
{
public ExportViewModelForProblemAttribute(Type viewModelType, Type questionType)
: base(questionType.ToString(), typeof(QuestionViewModel))
{
}
}
但是后来我说,我怎样才能通过构造函数传递对象?q
这个想法是在不使用 Import的情况下传递对象。但我在这部分迷路了。
public class ProblemViewModelFactory
{
private readonly CompositionContainer container;
[ImportingConstructor]
public ProblemViewModelFactory(CompositionContainer container)
{
this.container = container;
}
public QuestionViewModelFactory GetQuestionViewModelFactory(Question question)
{
// what can I do to return the correspond view model with the question inside?
}
}
我能做些什么来实现这个映射并传递参数?提前致谢。