Pregunta

Me gustaría poner en práctica un método que me permite acceder a una propiedad de un / objeto anónimo desconocido (-graph) de un modo de enlace en tiempo / dinámica (que no sé ni cómo llamar correctamente).

Este es un ejemplo de lo que me gustaría lograr:

// setup an anonymous object
var a = new { B = new { C = new { I = 33 } } };

// now get the value of a.B.C.I in a late-bound way
var i = Get(a, "B.C.I"); 

Y he aquí una aplicación sencilla utilizando la reflexión "clásico":

public static object Get(object obj, string expression)
{
    foreach (var name in expression.Split('.'))
    {
        var property = obj.GetType().GetProperty(name);
        obj = property.GetValue(obj, null);
    }
    return obj;
}

¿Qué otras opciones tengo con C # / .NET 4 de implementar algo similar como se muestra arriba, pero tal vez más simple, con más prestaciones, etc.?

Tal vez hay maneras de lograr lo mismo, lo que permitiría a mí especificar expression usando una expresión lambda en lugar de una cadena? ¿Estarían los árboles de expresión sean útiles en cualquier forma (por ejemplo, como se muestra en la esta pregunta ) ?

Actualizar : el objeto y la expresión se pasan en mi código a través de una llamada de servicio web. Es por eso que he utilizado object y string en mi método Get().

¿Fue útil?

Solución

¿Tienes realmente sólo tienen la expresión como una cadena? ¿Se sabe en tiempo de compilación, al igual que los propios tipos no se conocen (o son difíciles de expresar)? Si es así:

dynamic d = a;
int i = d.B.C.I;

Si realmente sólo tiene como una cadena (por ejemplo, como el usuario introducido datos) que hace la vida mucho más difícil, y ninguna de las características de C # 4 realmente le ayudará. Que usted podría evaluarlo como un guión IronPython o algo por el estilo ...

EDIT: Bueno, después de la actualización suena como si estuviera en esta última situación - en cuyo caso, no sé de una manera más agradable de utilizar la reflexión. Parte de la propiedad integrada unión construido para interfaces de usuario pueden ayudar, pero no sé de una forma limpia de acceder a él.

Otros consejos

Si desea utilizar el estilo # C, se podría utilizar el compilador Mono como un servicio desde la aplicación. Describo cómo hacer esto aquí: compilador Mono como servicio (MCS)

Como un enfoque alternativo, se podría utilizar la reflexión para poner todas las propiedades de su objeto en un ExpandoObject luego usarlo como un diccionario (porque ExpandoObject implementos IDictionary). Como alternativa, se puede usar JSON.NET y JObject.FromObject llamada, que a su vez, un objeto de regular en un jobject que se puede acceder en un diccionario-como el estilo (y como un beneficio adicional tiene soporte gráfico recursivo). Por último, se puede utilizar el mismo método para volcar su objeto en un diccionario de diccionarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top