MVVM RI と呼ばれる PRISM の例からコードをコピーしました。このファクトリ内にはDictionary<Type, Func<Question, QuestionViewModel>>
for マッピングがあります。ここにあります:
/// <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]
。それがうまくいかない理由です (私は推測します)。