using System.Collections.Generic;
public interface IGritProject
IEnumerable<Dependency> GetProjectDependencies();
public class EngineProject
public virtual IEnumerable<Dependency> GetDependencies()
yield return new Dependency { Label = "Engine" };
public class EngineProject<T> : EngineProject where T : IGritProject, new()
public override IEnumerable<Dependency> GetDependencies()
return base.GetDependencies()
.Concat(new T().GetProjectDependencies());
public class BindingsProject<T> : EngineProject where T : IGritProject, new()
public override IEnumerable<Dependency> GetDependencies()
return base.GetDependencies()
.Concat(GetProjectDependencies())
.Concat(new T().GetProjectDependencies());
private IEnumerable<Dependency> GetProjectDependencies()
yield return new Dependency { Label = "Bindings" };
public class MyBindableProject : BindingsProject<MyBindableProject>, IGritProject
public IEnumerable<Dependency> GetProjectDependencies()
yield return new Dependency { Label = "A" };
yield return new Dependency { Label = "B" };
public class NonBindableProject : EngineProject<NonBindableProject>, IGritProject
public IEnumerable<Dependency> GetProjectDependencies()
yield return new Dependency { Label = "C" };
public static void Main()
PrintDependencies(new MyBindableProject());
PrintDependencies(new NonBindableProject());
private static void PrintDependencies(EngineProject project)
Console.WriteLine(project.GetType());
foreach (var dep in project.GetDependencies())
Console.WriteLine(dep.Label);