The problem here is the lack of encapsulation. Interfaces should opt to expose methods over properties. By having the calling code access the properties in each of these implementations, knowledge leaks out from the implementation to the caller. Would it be possible to delegate the responsibility of reporting to each implementation? You would then have a `GenerateReport` method on your interface and the caller would not need to know what properties the class has. Repeat for the other ways in which the class is used and you might find that the responsibilities are more clear. --- The dictionary solution sucks because you lose static type checking, but those properties shouldn't be publically accessible in the first place. Once they are private, static typing will work out naturally and you will be forced to figure out ways to keep the format specific knowledge in the format class itself.