public static void Main()
Enum.GetValues<PaymentMethods>()
.Select((e, i) => $"{i + 1}. {e.ToString()}")
.Aggregate((x, y) => x + Environment.NewLine + y));
var key = Console.ReadLine()!;
var hasPaymentMethod = Enum.TryParse<PaymentMethods>(key, out var paymentMethod);
if (!hasPaymentMethod) return;
case PaymentMethods.CreditCard:
Console.Write("Card Number : ");
var cardNumber = Console.ReadLine();
if (string.IsNullOrEmpty(cardNumber)) return;
Console.Write("Full Name : ");
var fullName = Console.ReadLine();
if (string.IsNullOrEmpty(fullName)) return;
Console.Write("Expiry Date : ");
var expiryDate = Console.ReadLine();
if (string.IsNullOrEmpty(expiryDate)) return;
var cvc = Console.ReadLine();
if (string.IsNullOrEmpty(cvc)) return;
cart.SetPaymentStrategy(new CreditCardStrategy(cardNumber, fullName, expiryDate, cvc));
case PaymentMethods.Wallet:
cart.SetPaymentStrategy(new WalletStrategy());
throw new ArgumentOutOfRangeException();
public interface IPaymentStrategy
void Pay(decimal amount);
public class CreditCardStrategy : IPaymentStrategy
private string CardNumber { get; set; }
private string FullName { get; set; }
private string ExpiryDate { get; set; }
private string Cvc { get; set; }
public CreditCardStrategy(string cardNumber, string fullName, string expiryDate, string cvc)
public void Pay(decimal amount)
Console.WriteLine("Paying with credit card");
public class WalletStrategy : IPaymentStrategy
public void Pay(decimal amount)
Console.WriteLine("Paying with wallet");
public decimal TotalPrice { get; set; }
private IPaymentStrategy PaymentStrategy { get; set; }
public void SetPaymentStrategy(IPaymentStrategy paymentStrategy)
PaymentStrategy = paymentStrategy;
PaymentStrategy.Pay(TotalPrice);
public enum PaymentMethods