public static void Main()
var manager = new DictionaryManager(new SlDictionaryDal());
manager.SaveTranslation("English", "French", "hello", "bonjour");
manager.SaveTranslation("English", "Turkish", "hello", "bonjour");
abstract class BaseDictionaryEntry
public string Word { get; set; }
public string Translation { get; set; }
class EnglishTurkish : BaseDictionaryEntry { }
class EnglishFrench : BaseDictionaryEntry { }
public void AddTranslation(BaseDictionaryEntry entity)
Console.WriteLine($"Saved {entity.GetType()} to DB");
private readonly SlDictionaryDal _myDal;
public DictionaryManager(SlDictionaryDal dal)
public void SaveTranslation(string langFrom, string langTo, string word, string trans)
var entity = DictionaryFactory.CreateEntity(langFrom, langTo, word, trans);
_myDal.AddTranslation(entity);
static class DictionaryFactory
private static readonly Type[] DictEntryTypes =
(from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in domainAssembly.GetTypes()
where assemblyType.IsSubclassOf(typeof(BaseDictionaryEntry))
select assemblyType).ToArray();
public static BaseDictionaryEntry CreateEntity(string langFrom, string langTo, string word, string trans)
var dictLookupName = $"{langFrom}{langTo}".ToLowerInvariant();
var matchingType = DictEntryTypes.FirstOrDefault(t => t.Name.ToLowerInvariant() == dictLookupName);
if (matchingType == null)
throw new InvalidOperationException($"No dictionary exists matching the language pair {langFrom}{langTo}");
var entry = (BaseDictionaryEntry)Activator.CreateInstance(matchingType);
entry.Translation = trans;