作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想迭代一个我只能通过反射访问的索引属性,
但是(我在充分了解可能有一个令人尴尬的简单答案的情况下说这个,MSDN/Google 失败 =/)除了在 PropertyInfo.GetValue(prop , counter)
直到抛出 TargetInvocationException
。
阿拉:
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() );
}
}
最佳答案
索引器的 getter 就像普通方法一样,只是它需要方括号,而不是圆括号。您不会期望能够自动确定方法的可接受值范围,因此对于索引器来说是不可行的。
关于c# - 遍历索引属性(反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4268244/
我是一名优秀的程序员,十分优秀!