Reputation: 85
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
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
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