C # Asignación de CSV definida por el usuario a POCO

Tengo un sistema que lee datos de entrada de una fuente Serial / UDP / TCP. Los datos de entrada son simplemente un CSV de diferentes tipos de datos (por ejemplo, DateTime, double, int, string). Una cadena de ejemplo podría ser:

2012/03/23 12:00:00,1.000,23,information,1.234

Actualmente tengo un código (no probado) que permite al usuario especificar qué valor en la lista CSV va a qué propiedad de un POCO.

Así que en el ejemplo anterior, tendría un objeto como este:

public class InputData
{
 public DateTime Timestamp{get;set;}
 public double Distance{get;set;}
 public int Metres{get;set;}
 public string Description{get;set;}
 public double Height{get;set;}
} 

Ahora en esta clase, tengo un método para analizar una cadena CSV y rellenar las propiedades. Este método también requiere información de "mapeo", ya que no hay garantía de en qué orden llegarán los datos CSV; depende del usuario definir el orden correcto.

Esta es mi clase de mapeo:

//This general class handles mapping CSV to objects
public class CSVMapping
{
    //A dictionary holding Property Names (Key) and CSV indexes (Value)
    //0 Based index
    public IDictionary<string, int> Mapping { get; set; }
}

Ahora mi método ParseCSV ():

//use reflection to parse the CSV survey input
public bool ParseCSV(string pCSV, CSVMapping pMapping)
{
    if (pMapping == null) return false;
    else
    {
        Type t = this.GetType();
        IList<PropertyInfo> properties = t.GetProperties();
        //Split the CSV values
        string[] values = pCSV.Split(new char[1] { ',' });
        //for each property set its value from the CSV
        foreach (PropertyInfo prop in properties)
        {
            if (pMapping.Mapping.Keys.Contains(prop.Name))
            {
                if (prop.GetType() == typeof(DateTime))
                {
                    if (pMapping.Mapping[prop.Name] >= 0 && pMapping.Mapping[prop.Name] < values.Length)
                    {
                        DateTime tmp;
                        DateTime.TryParse(values[pMapping.Mapping[prop.Name]], out tmp);
                        prop.SetValue(this, tmp, null);
                    }
                }
                else if (prop.GetType() == typeof(short))
                {
                    if (pMapping.Mapping[prop.Name] >= 0 && pMapping.Mapping[prop.Name] < values.Length)
                    {
                        double tmp;
                        double.TryParse(values[pMapping.Mapping[prop.Name]], out tmp);
                        prop.SetValue(this, Convert.ToInt16(tmp), null);
                    }
                }
                else if (prop.GetType() == typeof(double))
                {
                    if (pMapping.Mapping[prop.Name] >= 0 && pMapping.Mapping[prop.Name] < values.Length)
                    {
                        double tmp;
                        double.TryParse(values[pMapping.Mapping[prop.Name]], out tmp);
                        prop.SetValue(this, tmp, null);
                    }
                }
                else if (prop.GetType() == typeof(string))
                {
                    if (pMapping.Mapping[prop.Name] >= 0 && pMapping.Mapping[prop.Name] < values.Length)
                    {
                        prop.SetValue(this, values[pMapping.Mapping[prop.Name]], null);
                    }
                }
            }
        }
        return true;
    }
}

Ahora para mi pregunta:

Potencialmente tengo varias clases que requerirán esta funcionalidad. ¿Sería beneficioso implementar una clase genérica o una clase de extensión para hacer el análisis por mí? ¿Es mi método una buena manera de analizar los datos CSV y poblar mi objeto, o hay una mejor manera de hacerlo?

He leído otras preguntas sobre el análisis dinámico de CSV, pero todas tratan sobre el orden conocido antes del tiempo de ejecución, mientras que requiero que el usuario defina el orden.

Respuestas a la pregunta(4)

Su respuesta a la pregunta