0

我从名为 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]行不通的原因(我猜)。

4

1 回答 1

0

你可以考虑使用ExportFactory<T>. 这包含在 Silverlight 中,对于 WPF,您可以从Glenn Block 的 Skydrive下载 Silverlight 代码的端口。

使用 anExportFactory您可以为给定的导入类型创建任意数量的对象。

[ImportMany]
public IEnumerable<ExportFactory<IModule, IModuleMetadata>> Modules { get; set; }

然后你可以调用 的CreateExport()方法ExportFactory来导出一个新的对象。我最近了解了如何使用ExportFactory,所以这篇文章可能会帮助您入门。

于 2012-09-12T22:13:20.117 回答