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;
}