using System.Collections.Generic;
class View<M> : View where M : Model {}
class ConcreteModel : Model {}
class ConcreteView : View<ConcreteModel> {}
static View CreateView<M>(M model) where M : Model {
Console.WriteLine(typeof(M));
Console.WriteLine(model.GetType());
if (model is ConcreteModel) {
return new ConcreteView();
public static void Main()
Model model = new ConcreteModel();
View view = CreateView(model);
Console.WriteLine(view.GetType());
Console.WriteLine("---");
ConcreteModel concreteModel = new ConcreteModel();
View concreteView = CreateView(concreteModel);
Console.WriteLine(concreteView.GetType());