假设我有一个具有一些属性的Car
类。其中一个性质是另一类Passenger
的IEnumerable
,具有自己的性质。
public class Car
{
public string Engine { get; set; }
public int Wheels { get; set; }
public IEnumerable<Passenger> Passengers { get; set }
}
我能够获得Engine和Wheels属性(以及所有其他此类属性)的值。然而,我不知道如何获得所有Passenger
对象的属性。下面是我所做的,以获得Car
对象的属性值:
Type type = car.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
object carValue = property.GetValue(car, null);
Console.WriteLine(carValue.ToString());
}
这显然不会给我Passenger
属性,而是输出这样的东西:
System.Collections.GenericList'1[Passenger]
我如何在car.Passengers
列表中获取每个Passenger
的所有属性值?
您可以将Type.IsGenericType
和Type.GetGenericTypeDefinition()
混合使用。
private void DisplayObject(object obj)
{
var type = obj.GetType();
foreach(var propertyInfo in type.GetProperties())
{
object value = propertyInfo.GetValue(obj, null);
if(propertyInfo.PropertyType.IsGenericType &&
propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
{
foreach(object o in (IEnumerable)value)
{
DisplayObject(o);
}
}
else
{
Console.WriteLine(value);
}
}
}
您将不得不检查Car
的属性是否首先是IEnumerable
,如果是,那么您将不得不再次使用反射。这可以使用递归更好地完成,如下所示:
你的车对象:
public class Car
{
public string Engine { get; set; }
public int Wheels { get; set; }
public IEnumerable<Passenger> Passengers { get; set; }
}
示例应用程序:
internal class Program
{
private static void Main(string[] args)
{
var car = new Car
{
Engine = "1234",
Wheels = 4,
Passengers = new List<Passenger>
{
new Passenger
{
Id = 1,
Name = "Bhushan"
}
}
};
ReflectObject(car);
Console.ReadKey();
}
功能使用:
private static void ReflectObject(object objectToReflect)
{
foreach (var propertyInfo in objectToReflect.GetType().GetProperties())
{
object propertyValue = propertyInfo.GetValue(objectToReflect, null);
if (IsEnumerable(propertyInfo))
{
foreach (object obj in (IEnumerable)propertyValue)
{
ReflectObject(obj);
}
}
else
{
Console.WriteLine(propertyValue);
}
}
}
private static bool IsEnumerable(PropertyInfo propertyInfo)
{
return propertyInfo.PropertyType.IsGenericType &&
propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>);
}
}
输出:1234年4 1
Bhushan