使用反射在任意对象上查找数组属性?

时间:2016-10-19 14:00:25

标签: c# reflection

我有一些生成的类,它们在形式上相似但没有继承关系,如下所示:

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);

似乎可以使用某种反射,但看起来会是什么样?

2 个答案:

答案 0 :(得分:1)

您可以迭代检查数组类型的属性:

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

    var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                    .Where(pi => pi.PropertyType.IsArray && 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 :(得分:0)

我可以建议其他方式来做这个,没有反思,因为所有这些类基本相同:

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
}