Skip to content

Generics? #388

@americanslon

Description

@americanslon

Is BlazorState supposed to work with Generics?

I am using the lib in my app extensively (thank you!) and this is the first time I have a need for generics but I am getting a runtime issue.

Here is my defenition

using BlazorState;

namespace TPL.Client.Core.States.ListPageFilter
{
    public partial class ListPageFilterState<T> where T : Domain.Core.Bases.SearchCritBase
    {
        public class SetCritAction : IAction
        {
            public T Crit { get; set; }
        }
    }
}
using BlazorState;
using MediatR;

namespace TPL.Client.Core.States.ListPageFilter
{
    public partial class ListPageFilterState<T> where T : Domain.Core.Bases.SearchCritBase
    {
        public class SetCritHandler : ActionHandler<SetCritAction>
        {
            public SetCritHandler(IStore aStore) : base(aStore) { }

            ListPageFilterState<T> state => Store.GetState<ListPageFilterState<T>>();

            public override Task<Unit> Handle(SetCritAction action, CancellationToken aCancellationToken)
            {
                state.Crit = action.Crit;

                return Unit.Task;
            }
        }
    }
}
using BlazorState;

namespace TPL.Client.Core.States.ListPageFilter
{
    public partial class ListPageFilterState<T> : State<ListPageFilterState<T>> where T : Domain.Core.Bases.SearchCritBase
    {
        public T Crit { get; private set; }

        public override void Initialize() { Crit = null; }
    }
}

Then upon actually setting the value of the Store
await Mediator.Send(new ListPageFilterState<TSearchCrit>.SetCritAction { Crit = null });

I get the following monstorsity

Microsoft.AspNetCore.Components.Web.ErrorBoundary[0]
      System.MemberAccessException: Cannot create an instance of TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1[T] because Type.ContainsGenericParameters is true.
         at System.Reflection.RuntimeConstructorInfo.CheckCanCreateInstance(Type declaringType, Boolean isVarArg)
         at System.Reflection.RuntimeConstructorInfo.ThrowNoInvokeException()
         at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSiteMain(ServiceCallSite callSite, RuntimeResolverContext argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSite(ServiceCallSite callSite, RuntimeResolverContext argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeServiceProviderEngine.<>c__DisplayClass4_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
         at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
         at BlazorState.Store.GetState(Type aType) in /_/Source/BlazorState/Store/Store.cs:line 70
         at BlazorState.Pipeline.State.CloneStateBehavior`2.<Handle>d__4[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext() in /_/Source/BlazorState/Pipeline/CloneState/CloneStateBehavior.cs:line 35
         at MediatR.Pipeline.RequestPreProcessorBehavior`2.<Handle>d__2[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext()
         at MediatR.Pipeline.RequestPostProcessorBehavior`2.<Handle>d__2[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext()
         at TPL.Client.Core.Bases.ListPage`2.<OnParametersSetAsync>d__12[[Domain.Session.Session, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() in C:\Users\ameri\source\repos\TPL.APP\TPL\Client\Core\Bases\ListPage.razor:line 40
         at TPL.Client.Pages.Session.Mine.Mine.OnParametersSetAsync() in C:\Users\ameri\source\repos\TPL.APP\TPL\Client\Pages\Session\Mine\Mine.razor:line 179
         at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
         at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()
System.MemberAccessException: Cannot create an instance of TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1[T] because Type.ContainsGenericParameters is true.
   at System.Reflection.RuntimeConstructorInfo.CheckCanCreateInstance(Type declaringType, Boolean isVarArg)
   at System.Reflection.RuntimeConstructorInfo.ThrowNoInvokeException()
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSiteMain(ServiceCallSite callSite, RuntimeResolverContext argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSite(ServiceCallSite callSite, RuntimeResolverContext argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeServiceProviderEngine.<>c__DisplayClass4_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at BlazorState.Store.GetState(Type aType) in /_/Source/BlazorState/Store/Store.cs:line 70
   at BlazorState.Pipeline.State.CloneStateBehavior`2.<Handle>d__4[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext() in /_/Source/BlazorState/Pipeline/CloneState/CloneStateBehavior.cs:line 35
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.<Handle>d__2[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext()
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.<Handle>d__2[[TPL.Client.Core.States.ListPageFilter.ListPageFilterState`1.SetCritAction[[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], TPL.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR.Contracts, Version=2.0.1.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2]].MoveNext()
   at TPL.Client.Core.Bases.ListPage`2.<OnParametersSetAsync>d__12[[Domain.Session.Session, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Domain.Session.SearchCrit, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() in C:\Users\ameri\source\repos\TPL.APP\TPL\Client\Core\Bases\ListPage.razor:line 40
   at TPL.Client.Pages.Session.Mine.Mine.OnParametersSetAsync() in C:\Users\ameri\source\repos\TPL.APP\TPL\Client\Pages\Session\Mine\Mine.razor:line 179
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions