Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ignore collection properties in PropertyInfo

I have a function with this code:

foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()){
//SOME CODE
if (propertyInfo.CanWrite)
    propertyInfo.SetValue(myCopy, propertyInfo.GetValue(obj, null), null);
}

I would avoid to check "collection" properties; to do this now I have insert this control:

 if (propertyInfo.PropertyType.Name.Contains("List")
     || propertyInfo.PropertyType.Name.Contains("Enumerable")
     || propertyInfo.PropertyType.Name.Contains("Collection"))
     continue;

but, It don't like me!

Which is a better way to do it?

like image 776
Luca Petrini Avatar asked May 14 '10 14:05

Luca Petrini


3 Answers

I was thinking you might want to check the interfaces the type of the property implements. (Removed redundant interfaces, as IList inherits ICollection and ICollection inherits IEnumerable.)

static void DoSomething<T>()
{
    List<Type> collections = new List<Type>() { typeof(IEnumerable<>), typeof(IEnumerable) };

    foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
    {
        if (propertyInfo.PropertyType != typeof(string) && propertyInfo.PropertyType.GetInterfaces().Any(i => collections.Any(c => i == c)))
        {
            continue;
        }

        Console.WriteLine(propertyInfo.Name);
    }
}

I added code to not reject string, as it implements IEnumerable, as well, and I figured you might want to keep those around.

In light of the redundancy of the prior list of collection interfaces, it may be simpler just to write the code like this

static void DoSomething<T>()
{
    foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
    {
        if (propertyInfo.PropertyType != typeof(string)
            && propertyInfo.PropertyType.GetInterface(typeof(IEnumerable).Name) != null
            && propertyInfo.PropertyType.GetInterface(typeof(IEnumerable<>).Name) != null)
        {
            continue;
        }

        Console.WriteLine(propertyInfo.Name);
    }
}
like image 51
Anthony Pegram Avatar answered Oct 19 '22 20:10

Anthony Pegram


I would probably check against IEnumerable.

if ((typeof(string) != propertyInfo.PropertyType) 
    && typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType))
{
    continue;
}
like image 45
LukeH Avatar answered Oct 19 '22 21:10

LukeH


bool isCollection = typeof(System.Collections.IEnumerable)
                          .IsAssignableFrom(propertyInfo.PropertyType);
like image 21
MaLio Avatar answered Oct 19 '22 20:10

MaLio