Как правильно применить приведение к переменной, чтобы оно приводило методы, которые идут с приведением? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь сделать более дружественный ООП оператор коммутатора, используя интерфейсы и тому подобное.Я создал два интерфейса, один из которых называется IAction , а другой - ICase . Интерфейс IAction включает в себя один метод, называемый Do (), который реализован в моих классах CaseX. ICase имеет одну переменную, и это ключ, который возвращает номер дела.Затем у меня есть два класса case, CasePut и CaseGet , которые реализуют оба этих интерфейса.Чтобы связать их вместе, я написал этот класс с именем ConditionRequest , который хранит как CasePut , так и CaseGet в списке.Для выполнения процедуры переключения у меня есть метод Switch () внутри класса ConditionRequest , который использует LINQ для выбора случая, в котором нуждается пользователь.Проблема возникает в методе Switch (), когда я использую .Where на ICase<int?>, а затем пытаюсь преобразовать его в IAction, используя .Select(p => p as IAction)

Я не пробовал ничего, кроме изменения синтаксиса, но безрезультатно.Я пытаюсь понять, почему IEnumerable<IAction> matches = Cases.Where(p => p.Key.Equals(key)) .Select(p => p as IAction); возвращает ноль

, строка 34-44

    public interface IAction
    {
        void Do();
    }

    public interface ICase<TCase>
    {
        TCase Key { get; }
    }

, строка 44-66 - это случаи, которые я определил

    public class CasePut : IAction, ICase<int?>
    {

        public int? Key { get { return 1; } }

        public void Do()
        {
            Request.Put putRequest = new Request.Put();
            putRequest.Request();
        }
    }
    public class CaseGet : IAction, ICase<int?>
    {
        public int? Key { get { return 2; } }

        public void Do()
        {
            Request.Get getRequest = new Request.Get();
            getRequest.Request();
        }
    }

строка 67-91.Эта функция является ядром в случае переключателя ООП, но она не работает должным образом, потому что я пытаюсь получить метод Do (), пытаясь преобразовать ICase<int?> в <IAction>

   public abstract class SwitchCase<TCase>
    {
        protected List<ICase<TCase>> Cases { get; set; }
    }

    public class ConditionRequest : SwitchCase<int?>
    {
        public ConditionRequest()
        {
            Cases = new List<ICase<int?>>
            {
                new CasePut(),
                new CaseGet()
            };
        }

        public void Switch(int? key)
        {
            IEnumerable<IAction> matches = Cases.Where(p => p.Key.Equals(key))
                .Select(p => p as IAction);

            foreach (IAction match in matches)
                match.Do();
        }
    }

Мой ожидаемый результат - в конечном итоге сделать так, чтобы через преобразование я мог получить доступ к методу класса Do (), потому что пока я могу получить только Ключ CaseX.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...