如何使用反射递归地获取类型的属性
本文关键字:取类型 属性 获取 何使用 反射 递归 | 更新日期: 2023-09-27 18:06:25
我需要递归地获得一个对象的所有DateTime
属性。
当前我正在做:
public static void GetDates(this object value)
{
var properties = value.GetType().GetProperties();
foreach (var property in properties)
{
if (property.GetType().IsClass)
{
property.SetDatesToUtc();
}
else
{
if (property.GetType() == typeof(DateTime))
{
//Do something...
}
}
}
}
然而,使用property.GetType().IsClass
是不够的,因为即使字符串或日期属性也是类。
是否有一种方法来获得属性是实际的类?
如果我添加一个接口的类有DateTime
属性,然后检查该属性是否实现该接口会更好吗?
你的思路是对的,但我觉得你的逻辑有点颠倒了。您应该更改日期时间,并在其他所有内容上运行相同的方法:
public static void GetDates(this object value)
{
if(value == null) //if this object is null, you need to stop
{
return;
}
var properties = value.GetType().GetProperties();
foreach(PropertyInfo property in properties)
{
//if the property is a datetime, do your conversion
if(property.GetType() == typeof(DateTime))
{
//do your conversion here
}
//otherwise get the value of the property and run the same logic on it
else
{
property.GetValue(value).GetDates(); // here is your recursion
}
}
}
我为具有DateTime
属性的类添加了一个接口。所以方法改为:
public static void GetDates(this object value)
{
var properties = value.GetType().GetProperties();
foreach (var property in properties)
{
if (typeof(IHasDateProperty).IsAssignableFrom(property.PropertyType))
{
property.SetDatesToUtc();
}
else
{
if (property.GetType() == typeof(DateTime))
{
//Do something...
}
}
}
}