Quiero itterate más de una propiedad indizada que sólo tengo acceso a través de la reflexión,iteración a través de una propiedad indexada (Reflexión)
pero (y lo digo en el pleno conocimiento de que es probable que haya una respuesta vergonzosamente simple, MSDN/Google fail = /) No puedo encontrar/pensar en una forma además de incrementar un contador en el PropertyInfo.GetValue(prop, counter)
hasta que se arroje el TargetInvocationException
.
ala:
foreach (PropertyInfo prop in obj.GetType().GetProperties())
{
if (prop.GetIndexParameters().Length > 0)
{
// get an integer count value, by incrementing a counter until the exception is thrown
int count = 0;
while (true)
{
try
{
prop.GetValue(obj, new object[] { count });
count++;
}
catch (TargetInvocationException) { break; }
}
for (int i = 0; i < count; i++)
{
// process the items value
process(prop.GetValue(obj, new object[] { i }));
}
}
}
ahora, hay algunos problemas con esto ... muy feo .. .. solución
¿y si es multidimensional o no indexados por números enteros, por ejemplo ..
Aquí está el código de prueba que estoy usando para intentar que funcione si alguien lo necesita. Si alguien está interesado, estoy haciendo un sistema de caché personalizado y .Equals no lo corta.
static void Main()
{
object str = new String(("Hello, World").ToArray());
process(str);
Console.ReadKey();
}
static void process(object obj)
{
Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();
// if this obj has sub properties, apply this process to those rather than this.
if (properties.Length > 0)
{
foreach (PropertyInfo prop in properties)
{
// if it's an indexed type, run for each
if (prop.GetIndexParameters().Length > 0)
{
// get an integer count value
// issues, what if it's not an integer index (Dictionary?), what if it's multi-dimensional?
// just need to be able to iterate through each value in the indexed property
int count = 0;
while (true)
{
try
{
prop.GetValue(obj, new object[] { count });
count++;
}
catch (TargetInvocationException) { break; }
}
for (int i = 0; i < count; i++)
{
process(prop.GetValue(obj, new object[] { i }));
}
}
else
{
// is normal type so.
process(prop.GetValue(obj, null));
}
}
}
else
{
// process to be applied to each property
Console.WriteLine("Property Value: {0}", obj.ToString());
}
}
¿Cuál es el propósito de 'str objeto = new String (("Hola, mundo"). ToArray())'? –
solo una variable de ejemplo para pasar a mi función ... estaba probando las diferentes formas de definir una cadena/String y la dejé en un poco incómodo ... 'object str =" Hello, World! ";' funciona igual de bien. –
¿Qué hacer si tengo claves STRING, no enteros? No sé sus nombres. ¿Cómo encontrarlos y usarlos? – Alexander