¿Cómo puedo obtener el valor de una propiedad de cadena mediante Reflection?

public class Foo { public string Bar {get; set;} } 

¿Cómo obtengo el valor de Bar, una propiedad de cadena, a través de la reflexión? El siguiente código lanzará una excepción si el tipo de PropertyInfo es un System.String

 Foo f = new Foo(); f.Bar = "Jon Skeet is god."; foreach(var property in f.GetType().GetProperties()) { object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type } 

Parece que mi problema es que la propiedad es un tipo de indexador, con System.String.

Además, ¿cómo puedo saber si la propiedad es un indexador?

Solo puede obtener la propiedad por su nombre:

 Foo f = new Foo(); f.Bar = "Jon Skeet is god."; var barProperty = f.GetType().GetProperty("Bar"); string s = barProperty.GetValue(f,null) as string; 

En cuanto a la pregunta de seguimiento: los indexadores siempre se denominarán Item y tendrán argumentos en el getter. Asi que

 Foo f = new Foo(); f.Bar = "Jon Skeet is god."; var barProperty = f.GetType().GetProperty("Item"); if (barProperty.GetGetMethod().GetParameters().Length>0) { object value = barProperty.GetValue(f,new []{1/* indexer value(s)*/}); } 

No pude reproducir el problema. ¿Estás seguro de que no estás tratando de hacer esto en algún objeto con propiedades de indexador? En ese caso, el error que experimente se generará al procesar la propiedad Item. Además, podrías hacer esto:

 public static T GetPropertyValue(object o, string propertyName) { return (T)o.GetType().GetProperty(propertyName).GetValue(o, null); } ...somewhere else in your code... GetPropertyValue(f, "Bar"); 
 Foo f = new Foo(); f.Bar = "x"; string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null); 
 var val = f.GetType().GetProperty("Bar").GetValue(f, null); 
 Foo f = new Foo(); f.Bar = "Jon Skeet is god."; foreach(var property in f.GetType().GetProperties()) { if(property.Name != "Bar") { continue; } object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type } 

Y aquí está para el seguimiento:

 class Test { public class Foo { Dictionary data =new Dictionary(); public int this[string index] { get { return data[index]; } set { data[index] = value; } } public Foo() { data["a"] = 1; data["b"] = 2; } } public Test() { var foo = new Foo(); var property = foo.GetType().GetProperty("Item"); var value = (int)property.GetValue(foo, new object[] { "a" }); int i = 0; } } 
 PropertyInfo propInfo = f.GetType().GetProperty("Bar"); object[] obRetVal = new Object[0]; string bar = propInfo.GetValue(f,obRetVal) as string; 

Es fácil obtener el valor de la propiedad de cualquier objeto mediante el método de extensión como:

 public static class Helper { public static object GetPropertyValue(this object T, string PropName) { return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null); } } 

El uso es:

 Foo f = new Foo(); f.Bar = "x"; var balbal = f.GetPropertyValue("Bar"); 

el valor de get con object y null funcionó muy bien para mí. Gracias por las publicaciones.

Contexto: recorrer todas las propiedades en un modelo MVC para New Hires y determinar sus valores publicados en el formulario:

newHire => el Modelo, con muchas propiedades, cuyos valores de formulario publicados quiero escribir individualmente en un conjunto de registros de la base de datos

 foreach(var propertyValue in newHire.GetProperties()) { string propName = propertyValue.Name; string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString(); }