Инициализация объектов в компоненте Blazor

2

С этим компонентом Blazor:

@page "/counter"

<h1>Counter</h1>

<p>Current count: @_a.CurrentCount</p>

<button class="btn btn-primary" onclick="@_b.IncrementCount">Click me</button>

@functions {
    private readonly ClassA _a = new ClassA();
    private readonly ClassB _b = new ClassB(_a);

    class ClassA
    {
        public int CurrentCount { get; set; }
    }

    class ClassB
    {
        private readonly ClassA _classA;

        public ClassB(ClassA classA)
        {
            _classA = classA;
        }

        public void IncrementCount() => _classA.CurrentCount++;
    }
}

Я получаю эту ошибку:

Ошибка CS0236 Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство '__Counter._a'

Этот поток объясняет, как решить эту ошибку в стандартном классе:

Почему вы не можете использовать 'this' в инициализаторах?

Но для этого нужен конструктор.

Можно ли добавить конструктор в компоненте Blazor?

Как устранить эту ошибку?

  • 1
    Вы, вероятно, должны использовать метод OnInit .
  • 0
    Это сделало работу, но мне нужно удалить атрибут readonly, чтобы инициализировать _a и _b в OnInit.
Показать ещё 1 комментарий
Теги:
blazor

1 ответ

3
Лучший ответ

Для того, чтобы классы были доступны только для чтения, вы должны перейти к "коду позади". Затем вы можете создавать экземпляры классов в конструкторе:

@page "/counter"
@inherits CounterBase
<h1>Counter</h1>

<p>Current count: @_a.CurrentCount ...

CounterBase.cs

using Microsoft.AspNetCore.Blazor.Components;

namespace YourApp.Pages
{

    public class ClassA
    {
        public int CurrentCount { get; set; }
    }

    public class ClassB
    {
        private readonly ClassA _classA;

        public ClassB(ClassA classA)
        {
            _classA = classA;
        }

        public void IncrementCount() => _classA.CurrentCount++;
    }

    public class CounterBase : BlazorComponent
    {
        protected readonly ClassA _a;
        protected readonly ClassB _b;

        //constructor
        public CounterBase()
        {
            _a = new ClassA();
            _b = new ClassB(_a);
        }
        ...
  • 0
    Конструктор недействителен. Вы можете удалить пустоту? И я действительно тебе отвечу.
  • 0
    Лель, конечно. Извините за опечатку. Любые другие комментарии приветствуются.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню