IEnumerable<T> and reflection
Posted
by Aren B
on Stack Overflow
See other posts from Stack Overflow
or by Aren B
Published on 2010-05-10T11:15:56Z
Indexed on
2010/05/10
11:44 UTC
Read the original article
Hit count: 813
Background
Working in .NET 2.0 Here, reflecting lists in general. I was originally using t.IsAssignableFrom(typeof(IEnumerable))
to detect if a Property I was traversing supported the IEnumerable
Interface. (And thus I could cast the object to it safely)
However this code was not evaluating to True
when the object is a BindingList<T>
.
Next
I tried to use t.IsSubclassOf(typeof(IEnumerable))
and didn't have any luck either.
Code
/// <summary>
/// Reflects an enumerable (not a list, bad name should be fixed later maybe?)
/// </summary>
/// <param name="o">The Object the property resides on.</param>
/// <param name="p">The Property We're reflecting on</param>
/// <param name="rla">The Attribute tagged to this property</param>
public void ReflectList(object o, PropertyInfo p, ReflectedListAttribute rla)
{
Type t = p.PropertyType;
//if (t.IsAssignableFrom(typeof(IEnumerable)))
if (t.IsSubclassOf(typeof(IEnumerable)))
{
IEnumerable e = p.GetValue(o, null) as IEnumerable;
int count = 0;
if (e != null)
{
foreach (object lo in e)
{
if (count >= rla.MaxRows)
break;
ReflectObject(lo, count);
count++;
}
}
}
}
The Intent
I want to basically tag lists i want to reflect through with the ReflectedListAttribute
and call this function on the properties that has it. (Already Working)
Once inside this function, given the object the property resides on, and the PropertyInfo
related, get the value of the property, cast it to an IEnumerable (assuming it's possible) and then iterate through each child and call ReflectObject(...)
on the child with the count variable.
© Stack Overflow or respective owner