Получить событие Action, используя Reflection в Blazor - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующий сервис:

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

Но я хочу сделать это generic c и получить событие, используя отражение. Я безуспешно попробовал следующее:

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

Как мне заставить это работать?

Большое спасибо!

1 Ответ

1 голос
/ 28 апреля 2020

@ Xerillio движется в правильном направлении. Я думаю, один из вариантов - сделать ваш сервис обобщенным c НО ограничить его интерфейсом , как описано здесь , и использовать интерфейс для предоставления контракта на OnChange событие. Отражение вообще не требуется, и теперь во всех реализациях сервиса должно быть событие OnChange, чтобы подписаться на него. (и отмените подписку во время разрыва!)

Вариант 2, если у вас есть много методов и свойств, которые, как вы знаете, вам понадобятся в каждом контексте, - это установить абстрактный класс или базовый класс, который позволит вам наследовать / переопределить некоторые из этих методов и свойств и настроить / расширить реализацию по своему усмотрению. Это будет зависеть от вас, чтобы диктовать, если это уместно, но все же удерживает вас от размышлений.

...