public TypeConstructor(Type concreteType = null, Action <T> initializer = null) { this.initializer = initializer; ReferenceType = typeof(T); ConcreteType = concreteType ?? ReferenceType; if (ReferenceType != ConcreteType && !ReferenceType.IsAssignableFrom(ConcreteType)) { throw new InvalidOperationException($"{ReferenceType.Name} cannot be used as a reference type for concrete type {ConcreteType.Name}"); } }