LuckyPennySoftware/MediatR · critical · InvalidOperationException

Could not create wrapper type for

Error message

Could not create wrapper type for {requestType}

What it means

In the strongly-typed Send<TResponse>(IRequest<TResponse>) path, MediatR builds and caches a RequestHandlerWrapperImpl<TRequest,TResponse> via reflection. MakeGenericType constructs the closed wrapper type and Activator.CreateInstance instantiates it; the null-coalescing throw fires only if Activator returns null, which for these internal parameterless wrapper types should never happen under normal runtime conditions.

Solutions

  1. Confirm you are using an unmodified, released MediatR assembly from NuGet.
  2. If running under trimming/AOT, ensure MediatR's wrapper types are preserved (dynamic registration requires reflection support).
  3. If running in partial trust, grant ReflectionPermission / use a full-trust host.
Defensive patterns

Strategy: try-catch

Try / catch

try { return await mediator.Send<TResponse>(request, ct); }
catch (InvalidOperationException ex) when (ex.Message.Contains("Could not create wrapper type"))
{ /* internal-invariant: report assembly/trimming/AOT health, do not retry unchanged */ throw; }

Prevention

When it happens

Trigger: Reached only if Activator.CreateInstance returns null for the closed RequestHandlerWrapperImpl<,> type. Practically this implies a type-loading or reflection-permission failure, or a corrupted MediatR build, since the wrapper types are internal MediatR types with public parameterless constructors.

Common situations: Essentially an internal-invariant failure: partial-trust / reflection-restricted environments, a custom MediatR build where wrapper constructors were removed, or AOT/trimming scenarios where the wrapper type was trimmed away.

Related errors


AI-assisted analysis of LuckyPennySoftware/MediatR@916ef1b3d6 (2026-08-13). Data as JSON: /api/errors/4c494ea2dc6377be. Report an issue: GitHub.

Appendix: source

Thrown at src/MediatR/Mediator.cs:60

        _serviceProvider.CheckLicense();
    }

    /// <summary>
    /// Gets or sets the license key. You can find your license key in your <a href="https://luckypennysoftware.com/account">account</a>.
    /// </summary>
    public static string? LicenseKey { get; set; }

    public Task<TResponse> Send<TResponse>(IRequest<TResponse> request, CancellationToken cancellationToken = default)
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }

        var handler = (RequestHandlerWrapper<TResponse>)_requestHandlers.GetOrAdd(request.GetType(), static requestType =>
        {
            var wrapperType = typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse));
            var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper type for {requestType}");
            return (RequestHandlerBase)wrapper;
        });

        return handler.Handle(request, _serviceProvider, cancellationToken);
    }

    public Task Send<TRequest>(TRequest request, CancellationToken cancellationToken = default)
        where TRequest : IRequest
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }

        var handler = (RequestHandlerWrapper)_requestHandlers.GetOrAdd(request.GetType(), static requestType =>
        {
            var wrapperType = typeof(RequestHandlerWrapperImpl<>).MakeGenericType(requestType);
            var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper type for {requestType}");

View on GitHub (pinned to 916ef1b3d6)