在 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 /重写其中一些方法和属性,并根据需要调整/扩展实现。这将由您决定是否合适,但仍然会让您无法思考。
我有以下服务:
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 /重写其中一些方法和属性,并根据需要调整/扩展实现。这将由您决定是否合适,但仍然会让您无法思考。