snippetcsharpModerate
Better way to create objects from strings
Viewed 0 times
objectscreatewaybetterfromstrings
Problem
I'm looking for a better way to create objects based off of a value of a string.
Consider the following:
Input file:
Classes:
Program:
My problem with the code is the switch statement. It feels messy and I'm looking for a better way.
Consider the following:
Input file:
//each Vehicle type has a list of different options
//whose length varies, I provided a simple case
van2006dodgegrand caravangreen~
car2010toyotacorollared~
truck2005toyotatundrablack~
Classes:
abstract class Vehicle: IVehicle{
public int Year;
public string Make;
public string Model;
...
}
class Van : Vehicle
{
...
}
class Car : Vehicle
{
...
}
class Truck : Vehicle
{
...
}Program:
static void Main(string[] args)
{
char delimiter = '*';
string fileToRead = "inventory.csv";
string currentLine = string.Empty;
List inventory = new List();
//Open file
using (StreamReader reader = new StreamReader(fileToRead))
{
//while you read each line
while ((currentLine = reader.ReadLine()) != null)
{
IVehicle temp;
//Tokenize the line
string[] parts = currentLine.Split(delimiter);
switch(parts[0])
{
case "van":
temp = new Van();
...
break;
case "car"
temp = new Car();
...
break;
case "truck"
temp = new Truck();
...
break;
}
inventory.add(temp);
}
}
...
}My problem with the code is the switch statement. It feels messy and I'm looking for a better way.
Solution
In .Net laguages you can easily instatiate any object given only the full name of the class (=namespace+class name).
Here is a runnable example:
So in your case it would break down to something like (of course, the names in your parameter file would need to exactly match the class names in your application):
Here is a runnable example:
using System;
using System.Reflection;
namespace Test
{
class MsgPrinter
{
public MsgPrinter()
{
System.Console.WriteLine("Hello!");
}
}
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.GetExecutingAssembly();
MsgPrinter printer = assembly.CreateInstance("Test.MsgPrinter") as MsgPrinter;
Console.Read();
}
}
}So in your case it would break down to something like (of course, the names in your parameter file would need to exactly match the class names in your application):
...
string[] parts = currentLine.Split(delimiter);
Vehicle vehicle = Assembly.GetExecutingAssembly().CreateInstance(namespace_name+"."+parts[0]) as Vehicle;
...Code Snippets
using System;
using System.Reflection;
namespace Test
{
class MsgPrinter
{
public MsgPrinter()
{
System.Console.WriteLine("Hello!");
}
}
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.GetExecutingAssembly();
MsgPrinter printer = assembly.CreateInstance("Test.MsgPrinter") as MsgPrinter;
Console.Read();
}
}
}...
string[] parts = currentLine.Split(delimiter);
Vehicle vehicle = Assembly.GetExecutingAssembly().CreateInstance(namespace_name+"."+parts[0]) as Vehicle;
...Context
StackExchange Code Review Q#4174, answer score: 11
Revisions (0)
No revisions yet.