diff --git a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs
index 35f85c9c2f..b4dcd39da2 100644
--- a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs
+++ b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs
@@ -6,30 +6,50 @@ namespace Umbraco.Core.Composing
///
/// Provides a base class for collections of types.
///
- public abstract class TypeCollectionBuilderBase : ICollectionBuilder
+ public abstract class TypeCollectionBuilderBase : ICollectionBuilder
+ where TBuilder : TypeCollectionBuilderBase
where TCollection : class, IBuilderCollection
{
private readonly HashSet _types = new HashSet();
- private Type Validate(Type type, string action)
+ protected abstract TBuilder This { get; }
+
+ private static Type Validate(Type type, string action)
{
if (!typeof(TConstraint).IsAssignableFrom(type))
throw new InvalidOperationException($"Cannot {action} type {type.FullName} as it does not inherit from/implement {typeof(TConstraint).FullName}.");
return type;
}
- public void Add(Type type) => _types.Add(Validate(type, "add"));
-
- public void Add() => Add(typeof(T));
-
- public void Add(IEnumerable types)
+ public TBuilder Add(Type type)
{
- foreach (var type in types) Add(type);
+ _types.Add(Validate(type, "add"));
+ return This;
}
- public void Remove(Type type) => _types.Remove(Validate(type, "remove"));
+ public TBuilder Add()
+ {
+ Add(typeof(T));
+ return This;
+ }
- public void Remove() => Remove(typeof(T));
+ public TBuilder Add(IEnumerable types)
+ {
+ foreach (var type in types) Add(type);
+ return This;
+ }
+
+ public TBuilder Remove(Type type)
+ {
+ _types.Remove(Validate(type, "remove"));
+ return This;
+ }
+
+ public TBuilder Remove()
+ {
+ Remove(typeof(T));
+ return This;
+ }
public TCollection CreateCollection(IFactory factory)
{
diff --git a/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs b/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs
index 7ea7472a87..03de95c798 100644
--- a/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs
+++ b/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs
@@ -3,6 +3,8 @@ using Umbraco.Web.WebApi;
namespace Umbraco.Web.Mvc
{
- public class SurfaceControllerTypeCollectionBuilder : TypeCollectionBuilderBase
- { }
-}
\ No newline at end of file
+ public class SurfaceControllerTypeCollectionBuilder : TypeCollectionBuilderBase
+ {
+ protected override SurfaceControllerTypeCollectionBuilder This => this;
+ }
+}
diff --git a/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs b/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs
index 190fcdb00e..a9cf7b4619 100644
--- a/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs
+++ b/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs
@@ -2,6 +2,8 @@
namespace Umbraco.Web.WebApi
{
- public class UmbracoApiControllerTypeCollectionBuilder : TypeCollectionBuilderBase
- { }
-}
\ No newline at end of file
+ public class UmbracoApiControllerTypeCollectionBuilder : TypeCollectionBuilderBase
+ {
+ protected override UmbracoApiControllerTypeCollectionBuilder This => this;
+ }
+}