using System.Collections.Immutable;
public static class MessageSenderExtensions
public static void SendMessage(this MessageSenderBase sender, string content)
string headerNoti = sender switch
EmailSender eSender => "Email sent: ",
SmsSender sSender => "SMS message sent: ",
FacebookSender fbSender => "Facebook message sent: ",
_ => throw new ArgumentException($"Something wicked happened: {nameof(sender)}")
Console.WriteLine($"{headerNoti}{content}");
public abstract class MessageSenderBase
public static void SendMessage(string content) {}
public class EmailSender : MessageSenderBase
public class SmsSender : MessageSenderBase
public class FacebookSender : MessageSenderBase
public static void Main()
var eSender = new EmailSender();
var fbSender = new FacebookSender();
var smsSender = new SmsSender();
var senders = ImmutableList<MessageSenderBase>.Empty;
senders = senders.Add(eSender);
senders = senders.Add(fbSender);
senders = senders.Add(smsSender);
foreach (var sender in senders) {
sender.SendMessage("hello God");