Las respuestas existentes están muy bien; solo una perspectiva alternativa: en muchos escenarios es deseable usar System.ComponentModel en lugar de reflexión directa, ya que esto permite escenarios de propiedades de tiempo de ejecución, es decir, cómo DataView de DataTable expone las columnas como propiedades.
Rendimiento - de forma predeterminada, esto es bastante idéntico, pero si está haciendo esto (por ejemplo, importación/exportación de datos masivos), puede obtener aumentos de rendimiento significativos utilizando este enfoque, cortesía de HyperDescriptor.
Para utilizar System.ComponentModel, el código es similar, pero sutilmente diferente:
static void Main()
{
object obj = new Customer { Address = new Address { ZipCode = "abcdef" } };
object address = GetValue(obj, "Address");
object zip = GetValue(address, "ZipCode");
Console.WriteLine(zip);
}
static object GetValue(object component, string propertyName)
{
return TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
Esto luego le da el mismo tratamiento como si se hubiera usado los datos de unión para unirse a "Address.ZipCode" (pasar por alto algunos detalles como listas, etc.).
(nota que usted podría emitir postal como cadena, etc, si usted sabe que es el tipo esperado)
Para obtener el valor de una ruta profunda (incluyendo el mismo manejo que los usos de enlace de datos lista), lo haría usar algo como:
static object ResolveValue(object component, string path) {
foreach(string segment in path.Split('.')) {
if (component == null) return null;
if(component is IListSource) {
component = ((IListSource)component).GetList();
}
if (component is IList) {
component = ((IList)component)[0];
}
component = GetValue(component, segment);
}
return component;
}
la lista de cosas más o menos refleja el comportamiento de regular de enlace de datos (aunque omite algunas cosas como vinculantes contextos, moneda-gerentes, etc.)
¡Buena respuesta! ... Superlike. – Hrishi