estoy tratando de escribir un simple objeto de diccionario convertidor, como a continuación:Tipos anónimos y Obtener acceso en WP7.1?
public static class SimplePropertyDictionaryExtensionMethods
{
public static IDictionary<string,string> ToSimplePropertyDictionary(this object input)
{
if (input == null)
return new Dictionary<string, string>();
var propertyInfos = from property in input.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty)
where property.CanRead
select property;
return propertyInfos.ToDictionary(x => x.Name, x => input.GetPropertyValueAsString(x));
}
public static string GetPropertyValueAsString(this object input, PropertyInfo propertyInfo)
{
var value = propertyInfo.GetGetMethod().Invoke(input, new object[] {});
if (value == null)
return string.Empty ;
return value.ToString();
}
}
Sin embargo, cuando trato de llamar a esto como:
var test = (new { Foo="12", Bar=15 }).ToSimplePropertyDictionary();
Entonces se produce un error con una excepción:
[System.MethodAccessException]: {"Attempt to access the method failed: .<>f__AnonymousType0`1.get_Foo()"}
¿Es este el modelo de seguridad de Mango que dice "No"? ¿Hay alguna manera de evitarlo? Se siente como si fuera un acceso público Obtener, por lo que parece que debería poder invocarlo.
Stuart
¡Gracias! Eso suena como una buena respuesta – Stuart
Tenemos un ganador, ¡gracias! – Stuart
mmm, buena respuesta. Nunca hubiera pensado en esto ya que BindingFlags.Public se pasa al obtener las propiedades. Hubiera pensado que no se habrían devuelto propiedades si el tipo anónimo es interno aunque MSDN establezca que las propiedades son públicas (lo que parece extraño si la clase padre no lo está). – calum