c# - 递归地使用泛型反射

标签 c# generics reflection

我有以下类(class):

public class BaseDataEntity
{
    private List<string> _Changes = new List<string>();

    public IEnumerable<string> GetChanges()
    {
        return _Changes;
    }

    public bool HasDataChanged
    {
        get { return (GetChanges().Count() > 0); }
    }

    public bool HasChildRecords
    {
        get { return (GetType().GetChildRecords().Count() > 0); }
    }
}

public class ChildRecords : IList<T> where T : BaseDataEntity
{

}

还有一些辅助方法:

public static PropertyInfo[] GetChildRecords(this Type aType)
{
    return aType.GetProperties().Where(pi => pi.IsChildRecords()).ToArray();
}

public static bool IsChildRecords(this PropertyInfo info)
{
    return (info.GetCustomAttributes(typeof(ChildRecordsAttribute), false).Length > 0);
}

我想做的是使用反射实现一个名为 HaveChildRecordsChanged 的​​属性。我的问题是如何使用反射来检查任意深度的所有 ChildRecords 的 HasDataChanged 属性?

我尝试过类似的方法:

var isChanged = false;

foreach (var info in GetType().GetChildRecords())
{
    var childRecordObject = info.GetValue(this, null);
    var childRecords = childRecordObject as ChildRecords<BaseDataEntity>;   //cannot unbox this, it evaluates as null
    if (null != childRecords && childRecords.Any(x => x.HasDataChanged))
    {
        isChanged = true;   //never hit
    }
}

return isChanged;   

最佳答案

ChildRecords<T>是通用的,所以 ChildRecords<Company>无法转换为 ChildRecords<BaseDataEntity>

由于您已经过滤了标有 ChildRecordsAttribute 的属性最简单的解决方案是转换为 IEnumerable并使用OfType<BaseDataEntity>()

var childRecords = childRecordObject as IEnumerable; // IList<T> will be IEnumerable
if (null != childRecords && childRecords.OfType<BaseDataEntity>().Any(x => x.HasDataChanged))
{
    isChanged = true;
}

关于c# - 递归地使用泛型反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48447583/

相关文章:

c# - Windows Phone 上的 TAEF Datadriven c# 应用程序

c# - 如何生成两个随机数 X 和 Y,并确保它们永不重复?

generics - 泛型中的 VHDL 常量

c# - 使用SAME Textbox在dataGridView中搜索和插入数据

c# - 如果包含撇号,如何插入数据?

c# - 通用接口(interface)和多态性

javascript - 接受类方法调用并返回该类的实例的工厂函数

php - 重新定义 PHP 方法,可以调用旧方法

c# - 判断两个不同的 PropertyInfo 是否来自同一个接口(interface)?

java - 如何通过反射在 Java 中调用构造函数?