Design Pattern for mapping generic class type to implementation - C#