Найти свойство массива для произвольного объекта с помощью отражения?

#c# #reflection

#c# #отражение

Вопрос:

У меня есть несколько сгенерированных классов, которые похожи по форме, но не имеют отношений наследования, например:

 class horse {}
class horses { public horse[] horse {get;}}
class dog {}
class dogs { public dog[] dog {get;}}
class cat {}
class cats { public cat[] cat {get;}}
  

Я хочу написать метод, подобный:

 ProcessAnimals<T>(Object o)
{
 find an array property of type T[]
 iterate the array
}
  

Итак, тогда я мог бы сделать:

 horses horses = ...;
ProcessAnimals<horse>(horses);
  

Кажется, что для чего-то можно использовать отражение, но как это будет выглядеть?

Комментарии:

1. Перебирайте свойства с помощью отражения, проверяя IsArray свойство для каждого типа свойства.

Ответ №1:

Вы можете выполнить итерацию по свойствам, проверяя тип массивов:

 void ProcessAnimals<T>(object o)
{
    var type = o.GetType();

    var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                    .Where(pi => pi.PropertyType.IsArray amp;amp; pi.PropertyType.GetElementType().Equals(typeof(T)));

    foreach (var prop in props)
    {
        var array = (T[])prop.GetValue(o);

        foreach (var item in array)
        {
            //Do something
        }
    }
}
  

Комментарии:

1. Могу ли я попросить разъяснений по BindingFlags деталям?

2. это для проверки свойств, которые являются общедоступными и имеют тип экземпляра. Чтобы исключить, например, защищенные и статические свойства.

Ответ №2:

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

 enum AnimalType
{
Horse,
Dog,
Cat
}
class Animal
{
public AnimalType Type;
}
class Animals
{
public Animal[] Animals { get; }
}
ProcessAnimals(Animals animals)
{
// do something with animals.Animals array
}