Make method parameter strongly typed without if/switch

Given a class method can generate report based on the type passed in from method parameter, an easy way to make parameter strongly typed is using enum:

    class ReportGenerator
        string _reportTypeInString;
        enum ReportType
            PDF = 0,

        void GetReport(ReportType reportType)
            switch (reportType)
                case ReportType.PDF:
                    _reportTypeInString = "PDF";
                case ReportType.EXCEL:
                    _reportTypeInString = "EXCEL";
                case ReportType.HTML:
                    _reportTypeInString = "HTML40";

            // logic to generate real report...

The problem here is: enum type in dotnet only supports integer, converting to string has to be done somewhere usually in a place different than the type define area, maintenance is problematic. Besides, the evil if/switch code smell.

Here is my way to do the same job:

        public class ReportFormat
            public string ReportFormatString { get; private set; }

            public static ReportFormat HTML32 = new ReportFormat("HTML3.2");
            public static ReportFormat HTML40 = new ReportFormat("HTML4.0");
            public static ReportFormat EXCEL = new ReportFormat("EXCEL");
            public static ReportFormat CSV = new ReportFormat("CSV");
            public static ReportFormat PDF = new ReportFormat("PDF");
            public static ReportFormat MHTML = new ReportFormat("MHTML");

            ReportFormat(string reportFormatString)
                ReportFormatString = reportFormatString;

//in my report generator class:
        public FileContentResult GetReport(string reportName, ReportFormat reportFormat, IList<ParameterValue> parameters)
// how to use
        var fileContentResult = reportingServiceProxy.GetReport(ReportName, ReportingServiceProxy.ReportFormat.HTML40, parameters);

Work amount is almost same, the type maintenance is in same place, the biggest selling point, no evil if/switch statement anymore.

Which design pattern is used here?


4 thoughts on “Make method parameter strongly typed without if/switch

    • This was my original plan actually. I realize this dictionary must sit somewhere outside of the ReportFormat class in which I really want encapsulate the mapping data. Basically both solution are almost same, while non-dictionary one is more maintainable, I think.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s