#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
}