Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine if a property is a kind of array by reflection

Tags:

c#

reflection

How can I determine if a property is a kind of array.

Example:

public bool IsPropertyAnArray(PropertyInfo property)
{
    // return true if type is IList<T>, IEnumerable<T>, ObservableCollection<T>, etc...
}
like image 285
Melursus Avatar asked Feb 24 '12 16:02

Melursus


2 Answers

You appear to be asking two different questions: whether a type is an array (e.g. string[]) or any collection type.

For the former, simply check property.PropertyType.IsArray.

For the latter, you have to decide what is the minimum criteria you want a type to conform to. For example, you could check for the non-generic IEnumerable by using typeof(IEnumerable).IsAssignableFrom(property.PropertyType). You can also use this for generic interfaces if you know the actual type of T, e.g. typeof(IEnumerable<int>).IsAssignableFrom(property.PropertyType).

Checking for the generic IEnumerable<T> or any other generic interface without knowing the value of T can be done by checking if property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) is not null. Note that I didn't specify any type for T in that code. You can do the same for IList<T> or any other type you're interested in.

For example you could use the following if you want to check for the generic IEnumerable<T>:

public bool IsPropertyACollection(PropertyInfo property) 
{ 
    return property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null;
} 

Arrays also implement IEnumerable, so they will also return true from that method.

like image 88
Sven Avatar answered Nov 14 '22 21:11

Sven


Excluding String class as it qualifies as a collection because it implements IEnumerable<char>.

public bool IsPropertyACollection(this PropertyInfo property)
{
    return (!typeof(String).Equals(property.PropertyType) && 
        typeof(IEnumerable).IsAssignableFrom(property.PropertyType));
}
like image 22
Furqan Safdar Avatar answered Nov 14 '22 20:11

Furqan Safdar