[英]Getting property values of list of child objects
假设我有一个带有某些属性的Car
类。 其中一个属性是另一个类的IEnumerable
,它具有自己的属性Passenger
。
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
所有财产价值? 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
布尚
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.