在 Blazor 中使用反射获取事件操作

Get event Action using Reflection in Blazor

我有以下服务:

public class Service
{

    private List<Model> _modelList = new List<Model>();

    public List<Model> Modellist
    {
        get { return _modelList ; }
        private set
        {
            _modelList = value;
            NotifyStateChanged();
        }
    }

    public event Action OnChange;
    public void NotifyStateChanged() => OnChange?.Invoke();
}

通常使用如下:

protected override void OnInitialized()
{
    _Service.OnChange += StateHasChanged;
}

但我想使它通用,并使用反射获取事件。我尝试了以下但没有成功:

protected override void OnInitialized()
{
    var backingField = Service.GetType().GetField("OnChange", BindingFlags.Instance | BindingFlags.NonPublic);
    var delegateInstance = (Action)backingField.GetValue(Service);
    delegateInstance += StateHasChanged;
}

我如何让它工作?

非常感谢!

我认为@Xerillio 正朝着正确的方向前进,一种选择是使您的服务通用但使用接口 as discussed here 对其进行约束,并使用该接口为 OnChange 事件。这种方式根本不需要反射,现在服务的所有实现都必须订阅 OnChange 事件。 (并在拆解期间退订!)

选项 2 如果您知道在每个上下文中都需要很多方法和属性,则设置一个允许您继承的抽象 class 或基础 class /重写其中一些方法和属性,并根据需要调整/扩展实现。这将由您决定是否合适,但仍然会让您无法思考。