Этот код на самом деле не чище, чем switch
, если только словарь не используется несколькими методами.При использовании объектов рисования и интерфейсов все методы Draw
могут быть статическими методами в одном классе.
Отвечая на точный вопрос, можно использовать Dictionary.TryGetValue
:
public static void Draw(Shapes s, Color c)
{
if (Mapper.TryGetValue(s,out var act))
{
act(c);
}
}
Все Draw
методы могут измениться на статические, поскольку они не используют никаких элементов экземпляра:
private static IDictionary<Shapes, Action<Color>> Mapper = new Dictionary<Shapes, Action<Color>>
{
[Shapes.Circle]= (Color c) => DrawTriangle.Draw(c),
[Shapes.Rectangle]= (Color c) => DrawRectangle.Draw(c),
[Shapes.Triangle]=(Color c) => DrawCircle.Draw(c)
};
Если нет:
private static IDictionary<Shapes, Action<Color>> Mapper = new Dictionary<Shapes, Action<Color>>
{
[Shapes.Circle] = DrawTriangle.Draw,
[Shapes.Rectangle] = DrawRectangle.Draw,
[Shapes.Triangle] = DrawCircle.Draw
};
Обновление
Кстати, синтаксис показывает, что происходит что-то странное.Использование типов вместо перечисления предотвратило бы рисование кругов при запросе круга
Нам нужно было бы узнать больше о том, откуда берется Shapes
, или почему интерфейсы используются для созданиялучшая реализация, и , избегайте использования неправильной реализации
Просто для удовольствия, между прочим, можно использовать выражения переключения C # 8 вместе с интерфейсами:
var drawer= shapes switch
{
Shapes.Circle =>new DrawingTriangle(),
Shapes.Rectangle=>new DrawingRectangle(),
Shapes.Triangle =>new DrawingCircle(),
_ => ???
};
drawer.Draw(c);