如何使用反射递归地获取类型的属性

本文关键字:取类型 属性 获取 何使用 反射 递归 | 更新日期: 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...
            }
        }
    }
}