Yasith Jayawardana
Yasith Jayawardana

Reputation: 85

How to minimize code redundancy when using switch to create different object types

Hi I am creating a part of a program where i need to return a list of objects of specific types. The problem part of code is below. It looks too redundant and i want a way to make it simple

switch (sqlDataReader["TypeName"].ToString())
    {
                case "Manager":
                {
                    yield return new Manager(
                        sqlDataReader["Employee_ID"].ToString(),
                        sqlDataReader["Name"].ToString(),
                        sqlDataReader["ContactInfo"].ToString(),
                        sqlDataReader["JoinDateTime"].ToString(),
                        bool.Parse(sqlDataReader["Active"].ToString()),
                        sqlDataReader["Username"].ToString(),
                        sqlDataReader["Password"].ToString()
                        );
                    break;
                }
                case "Inventory Manager":
                {
                    yield return new InventoryManager(
                        sqlDataReader["Employee_ID"].ToString(),
                        sqlDataReader["Name"].ToString(),
                        sqlDataReader["ContactInfo"].ToString(),
                        sqlDataReader["JoinDateTime"].ToString(),
                        bool.Parse(sqlDataReader["Active"].ToString()),
                        sqlDataReader["Username"].ToString(),
                        sqlDataReader["Password"].ToString()
                        );
                    break;
                }
                case "Cashier":
                {
                    yield return new Cashier(
                        sqlDataReader["Employee_ID"].ToString(),
                        sqlDataReader["Name"].ToString(),
                        sqlDataReader["ContactInfo"].ToString(),
                        sqlDataReader["JoinDateTime"].ToString(),
                        bool.Parse(sqlDataReader["Active"].ToString()),
                        sqlDataReader["Username"].ToString(),
                        sqlDataReader["Password"].ToString()
                        );
                    break;
                }
            }
        }

        Connection.Close();
    }

Is there a way i can avoid this whole redundancy? FYI I have an abstract base class called User for these types.

Thanks!

Upvotes: 3

Views: 49

Answers (2)

nurkanat
nurkanat

Reputation: 51

You can create new class or struct UserData with all properties you use to create objects, and use this UserData in constructors

    var userData = new UserData(sqlDataReader["Employee_ID"].ToString(),
                        sqlDataReader["Name"].ToString(),
                        sqlDataReader["ContactInfo"].ToString(),
                        sqlDataReader["JoinDateTime"].ToString(),
                        bool.Parse(sqlDataReader["Active"].ToString()),
                        sqlDataReader["Username"].ToString(),
                        sqlDataReader["Password"].ToString());
  switch (sqlDataReader["TypeName"].ToString())
    {
                case "Manager": yield return new Manager(userData);
                case "Cashier": yield return new Cashier(userData);

    }

Upvotes: 1

diiN__________
diiN__________

Reputation: 7656

Try this:

Type type = Type.GetType(sqlDataReader["TypeName"].ToString());
var instanceOfClass =
    Activator.CreateInstance(
            type,
            sqlDataReader["Employee_ID"].ToString(),
            sqlDataReader["Name"].ToString(),
            sqlDataReader["ContactInfo"].ToString(),
            sqlDataReader["JoinDateTime"].ToString(),
            bool.Parse(sqlDataReader["Active"].ToString()),
            sqlDataReader["Username"].ToString(),
            sqlDataReader["Password"].ToString()
    );

By using this you won't need a switch statement.

Upvotes: 2

Related Questions