Last active
March 17, 2019 21:17
-
-
Save karelkral/9db2e176b164da96177706062a26499a to your computer and use it in GitHub Desktop.
Answer to closed SO question https://stackoverflow.com/questions/55203279/c-sharp-coding-assessment-need-help-understanding-specs?noredirect=1#comment97143784_55203279
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://stackoverflow.com/questions/55203279/c-sharp-coding-assessment-need-help-understanding-specs | |
using System; | |
public interface INotification | |
{ | |
void Send(string message, object payLoad); | |
} | |
public class Email : INotification | |
{ | |
string _message { get; set; } | |
object _payLoad { get; set; } | |
public void Send(string message, object payLoad) | |
{ | |
_message = message; | |
_payLoad = payLoad; | |
Console.WriteLine($"message \"{message}\" sent by {this.GetType()}"); | |
} | |
} | |
public class Fax : INotification | |
{ | |
string _message { get; set; } | |
object _payLoad { get; set; } | |
public void Send(string message, object payLoad) | |
{ | |
_message = message; | |
_payLoad = payLoad; | |
Console.WriteLine($"message \"{message}\" sent by {this.GetType()}"); | |
} | |
} | |
public class Report : INotification | |
{ | |
string _message { get; set; } | |
object _payLoad { get; set; } | |
public void Send(string message, object payLoad) | |
{ | |
_message = message; | |
_payLoad = payLoad; | |
Console.WriteLine($"message \"{message}\" sent by {this.GetType()}"); | |
} | |
} | |
// EDI GENERATOR | |
public class EdiGenerator | |
{ | |
public void Generate(string[] configurationData) | |
{ | |
foreach (string notificatorType in configurationData) | |
{ | |
// https://stackoverflow.com/questions/11107536/convert-string-to-type-in-c-sharp | |
Type type = Type.GetType(notificatorType, true); | |
INotification sender = (INotification)Activator.CreateInstance(type); | |
sender.Send("this is message to send", new object()); | |
} | |
} | |
} | |
public static class MainClass | |
{ | |
public static void Main(string[] args) | |
{ | |
EdiGenerator generator = new EdiGenerator(); | |
//"Report, ConsoleApp3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", | |
// "Fax, ConsoleApp3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", | |
// "EMail, ConsoleApp3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", | |
// notificators should contains Type names of notificators | |
string[] notificators = new string[] | |
{ | |
"Report", | |
"Fax", | |
"Email", | |
}; | |
generator.Generate(notificators); | |
} | |
} |
Depends on yours preferences. I was taken into account the parameters string[] configurationData
, which does not allow many other solution.
But you can:
- Inject a factory to a generator for creating classes which are not known in time of compilation.
- Resolve a class from dependency container in generator. For example register all
INotification
instances in DI container and resolve all registered instances in generator. Depends of concrete DI container.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the help, would there have been any way to do this without using Activator.CreateInstance() or is this dependency injection so it requires the use because type isn't known at compile time?