итерация по индексированному свойству (Reflection)

Я хочу повторить проиндексированное свойство, к которому у меня есть доступ только через отражение,

но (и я говорю это, зная, что, вероятно, есть досадно простой ответ, MSDN / Google fail = /) Я не могу найти / придумать способ, кроме увеличения счетчика над PropertyInfo.GetValue (prop , counter) до тех пор, пока не будет сгенерировано 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 } ) );
        }
    }
}

сейчас, есть некоторые проблемы с этим ... очень уродливым .. решением ..

что, если оно многомерные или не индексированные целыми числами, например ...

вот тестовый код, который я использую, чтобы попытаться заставить его работать, если кому-то это нужно. Если кому-то интересно, я делаю собственную систему кэширования, и .Equals ее не сокращает.

    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() );
        }
    }
10
задан Dead.Rabit 24 November 2010 в 15:08
поделиться