¿Cómo puedo crear un objeto con una propiedad establecida a partir de una ruta de propiedad de cadena como lo hace el enlace de datos?

Tengo una lista de rutas de propiedad y valores como cadenas en un archivo de texto. ¿Existe una herramienta de mapeo o serialización que pueda tomar una cadena de ruta de propiedad ("Package.Customer.Name") y crear el objeto y establecer el valor?

preguntado el 12 de junio de 12 a las 21:06

1 Respuestas

    /// <summary>
    /// With a data row, create an object and populate it with data
    /// </summary>
    private object CreateObject(List<DataCell> pRow, string objectName)
    {
        Type type = Type.GetType(objectName);
        if (type == null)
            throw new Exception(String.Format("Could not create type {0}", objectName));
        object obj = Activator.CreateInstance(type);

        foreach (DataCell cell in pRow)
        {           
            propagateToProperty(obj, *propertypath*, cell.CellValue);
        }

        return obj;
    }




   public static void propagateToProperty(object pObject, string pPropertyPath, object pValue)
        {
            Type t = pObject.GetType();
            object currentO = pObject;
            string[] path = pPropertyPath.Split('.');
            for (byte i = 0; i < path.Length; i++)
            {
                //go through object hierarchy
                PropertyInfo pi = t.GetProperty(path[i]);
                if (pi == null)
                    throw new Exception(String.Format("No property {0} on type {1}", path[i], pObject.GetType()));

                //an object in the property path
                if (i != path.Length - 1)
                {
                    t = pi.PropertyType;
                    object childObject = pi.GetValue(currentO, null);
                    if (childObject == null)
                    {
                        childObject = Activator.CreateInstance(t);
                        pi.SetValue(currentO, childObject, null);
                    }
                    currentO = childObject;

                //the target property
                else
                {
                    if (pi.PropertyType.IsEnum && pValue.GetType() != pi.PropertyType)
                        pValue = Enum.Parse(pi.PropertyType, pValue.ToString());
                    if (pi.PropertyType == typeof(Guid) && pValue.GetType() != pi.PropertyType)
                        pValue = new Guid(pValue.ToString());
                    if (pi.PropertyType == typeof(char))
                        if (pValue.ToString().Length == 0)
                            pValue = ' ';
                        else
                            pValue = pValue.ToString()[0];

                    pi.SetValue(currentO, pValue, null);
                }
            }
        }

Eso es lo que uso. Lo acabo de abrir en VS, tal vez pueda ayudarte. El propiedadRuta es un marcador de posición para la ruta de su propiedad, lo eliminé de mi código. Si está buscando una solución más robusta, Automapper probablemente funcionaría bien, como ya lo sugirió alguien más.

Respondido el 12 de junio de 12 a las 22:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.