Я хочу повторить проиндексированное свойство, к которому у меня есть доступ только через отражение,
но (и я говорю это, зная, что, вероятно, есть досадно простой ответ, 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() );
}
}