在Blazor组件中初始化对象

7

有了这个 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 组件中是否可以添加构造函数?
如何解决这个错误?

2
你可能需要使用OnInit方法。 - H H
这样做可以完成工作,但我需要在OnInit中删除只读属性以初始化_a和_b。 - vernou
@HenkHolterman,“init”也是我的第一个想法,但在阅读OP评论后,我猜“code-behind”是与只读属性要求相匹配的唯一方法。我已经用这个想法详细回答了。 - dani herrera
1个回答

8
为了使类只读,您需要转移到"code-behind"。然后您可以在构造函数中实例化类:
@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);
        }
        ...

当然,不好意思打错了。欢迎留下任何评论。 - dani herrera
现在,我遇到了这个错误:Error CS0122 'CounterBase._a' 由于其保护级别而无法访问。如果我将其替换为protected,则无法使用readonly。还有其他想法吗? - vernou
现在是否已经使用了public class进行修复?或者将classA和classB作为嵌套类移动。也许嵌套类更接近您最初的问题。 - dani herrera
在子类中无法访问私有字段。您需要添加一个getter并在组件中使用此getter。在构造函数中,使用字段而不是声明变量。您能否改进您的答案? - vernou
我已经测试了你的代码。它完美地工作了。感谢你的帮助。 - vernou
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接