Я пытаюсь сделать более дружественный ООП оператор коммутатора, используя интерфейсы и тому подобное.Я создал два интерфейса, один из которых называется 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.
Заранее спасибо.