C# 使用Blazor中的反射获取事件操作

C# 使用Blazor中的反射获取事件操作,c#,reflection,blazor,blazor-client-side,C#,Reflection,Blazor,Blazor Client Side,我有以下服务: public class Service { private List<Model> _modelList = new List<Model>(); public List<Model> Modellist { get { return _modelList ; } private set { _modelList = value;

我有以下服务:

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()
{
    var backingField = Service.GetType().GetField("OnChange", BindingFlags.Instance | BindingFlags.NonPublic);
    var delegateInstance = (Action)backingField.GetValue(Service);
    delegateInstance += StateHasChanged;
}
我怎样才能让它工作


非常感谢

@Xerilio的方向是正确的,我认为,一个选择是使您的服务通用化,但用一个接口约束它,并使用该接口为
OnChange
事件提供契约。这种方式根本不需要反射,现在服务的所有实现都必须订阅
OnChange
事件。(并在拆卸过程中取消订阅!)


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

OnChange
是plublic,为什么要申请私人会员?(
BindingFlags.Instance | BindingFlags.NonPublic
)在您使用反射解决问题之前,您可以先描述一下您的问题吗?这听起来像是你可以用接口或类似的工具轻松解决的问题。我有25+项服务。我有一个模板组件,其中包含服务类型的参数,因此我可以在模板组件中使用该服务的所有属性、方法和事件。
protected override void OnInitialized()
{
    var backingField = Service.GetType().GetField("OnChange", BindingFlags.Instance | BindingFlags.NonPublic);
    var delegateInstance = (Action)backingField.GetValue(Service);
    delegateInstance += StateHasChanged;
}