Игнорировать свойства коллекции в PropertyInfo - PullRequest
9 голосов
/ 14 мая 2010

У меня есть функция с этим кодом:

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

Я бы не стал проверять свойства "коллекции"; чтобы сделать это сейчас, я должен вставить этот элемент управления:

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

но, я не нравлюсь!

Какой лучший способ сделать это?

Ответы [ 3 ]

16 голосов
/ 14 мая 2010

Я подумал, что вы можете проверить интерфейсы, которые реализует тип свойства. (Удалены избыточные интерфейсы, поскольку IList наследует ICollection, а ICollection наследует 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);
    }
}

Я добавил код, чтобы не отклонять строку, так как он также реализует IEnumerable, и я подумал, что вы, возможно, захотите оставить их рядом.

В свете избыточности предыдущего списка интерфейсов сбора, может быть проще просто написать код, подобный этому

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);
    }
}
9 голосов
/ 14 мая 2010

Я бы, наверное, проверил против IEnumerable.

if ((typeof(string) != propertyInfo.PropertyType) 
    && typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType))
{
    continue;
}
5 голосов
/ 14 мая 2010
bool isCollection = typeof(System.Collections.IEnumerable)
                          .IsAssignableFrom(propertyInfo.PropertyType);
...