Blazor-Component hereda de BaseClass

Sep 29 2020

Estoy a punto de crear una clase base para mis componentes Razor. Esta Clase Base se parece a:

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

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

mi Blazor-Component hereda de esta clase

@inherits ExampleBase

<button @onclick="Submit" />

Hasta ahora todo bien, pero cuando inicio mi aplicación y esta página está a punto de cargarse, recibo una excepción:

[2020-09-29T12: 09: 03.920Z] Error: System.ArgumentException: el tipo de componente debe implementar Microsoft.AspNetCore.Components.IComponent. en Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (secuencia Int32, Type componentType)

¿Qué hay de malo en ser heredado de ComponentBase?

Gracias por tu ayuda

Además: llamo a mi Razor-Component así y la Excepción se lanza al constructor.

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

Espero que esto ayude

Respuestas

JoeGER94 Sep 30 2020 at 04:32

En primer lugar, gracias a todos por su ayuda, ¡lo agradezco mucho!

Después de unas horas de descanso. Encontré mi propio error ...

Lo que estoy haciendo: he creado un servicio que carga una Lista de lista de tipos que este servicio se inyecta en un componente Razor.

El código de servicio:

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

En mi Razor-Component, he mostrado la lista de Razor-Component que es devuelto por el servicio.

@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();
  };
}

Ahora mi estúpido error ... Después de que agregué @inherits ExampleBase a todos mis Razor-Components, los componentes no fueron reconocidos por mi "MyService" porque busqué allí

x=>x.BaseType is ComponentBase 

esto provocó una lista vacía de componentes de Razor y cuando llamé a CreateFragment(Type typeToDisplay)typeToDisplay era nulo.

Realmente no entiendo por qué builder.OpenComponent(0, null)no lanza una NullReferenceException. Eso es confuso para mi

un error tan estúpido por mi parte me tomó muchos nervios ... espero que esto evite que otros olviden esto :)