Blazor-Component herda de BaseClass

Sep 29 2020

Estou prestes a criar uma classe base para meus componentes do Razor. Esta classe base se parece com:

public abstract class ExampleBase : ComponentBase 
{
    public virtual void Submit()
    {
        //DoSomething
    }

    public virtual void Back()
    {
        //DoSomething else
    }
}

meu Blazor-Component herda desta classe

@inherits ExampleBase

<button @onclick="Submit" />

Até aí tudo bem, mas quando eu inicio meu aplicativo e esta página está prestes a carregar, recebo uma exceção:

[2020-09-29T12: 09: 03.920Z] Erro: System.ArgumentException: O tipo de componente deve implementar Microsoft.AspNetCore.Components.IComponent. em Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (sequência Int32, Type componentType)

o que há de errado em ser herdado do ComponentBase?

Obrigado pela ajuda

Adição: Eu chamo meu Razor-Component assim e a exceção lança em builder.OpenComponent

RenderFragment CreateFragment() => builder =>
{
  builder.OpenComponent(0, typeof(MyRazorComponent));
  builder.CloseComponent();
}

Espero que isto ajude

Respostas

JoeGER94 Sep 30 2020 at 04:32

Em primeiro lugar - Obrigado a todos pela ajuda, agradeço muito!

Depois de algumas horas de intervalo. Eu encontrei meu próprio erro ...

O que estou fazendo: criei um serviço que carrega uma lista de tipos de lista que esse serviço é injetado em um componente do Razor.

O código de serviço:

//this returns a listOfRazorComponents
return AppDomain.CurrentDomain.GetAssemblies()
            .Where(x => x.FullName.StartsWith("SampleApplication")).FirstOrDefault()
            .DefinedTypes.Where(x=>x.BaseType is ComponentBase);

No meu Razor-Component eu exibi a Lista de Razor-Component que é retornada pelo serviço.

@page "/"
@inject MyService myService


@CurrentFragment

@code{

  private RenderFragment CurrentFragment { get; set; }
  private List<TypeInfo> listOfRazorComponents;
 
  protected override void OnInitialized
  {
     listOfRazorComponents = new List<TypeInfo>(myService.GetRazorComponents());
     CreateFragment(listOfRazorComponents[0]);
  }

  RenderFragment CreateFragment(Type typeToDisplay) => builder =>
  {
     builder.OpenComponent(0, typeToDisplay);
     builder.CloseComponent();
  };
}

Agora meu erro estúpido ... Depois de adicionar o @inherits ExampleBase a todos os meus componentes do Razor, os componentes não foram reconhecidos pelo meu "MyService" porque eu verifiquei lá por

x=>x.BaseType is ComponentBase 

isso causou uma lista vazia de componentes do Razor e quando chamei CreateFragment(Type typeToDisplay)o typeToDisplay era nulo.

Eu realmente não entendo por builder.OpenComponent(0, null)que não lança um NullReferenceException. Isso me confunde

um erro tão estúpido de minha parte me deixou muito nervoso ... espero que isso impeça os outros de esquecer isso :)