jeudi 25 janvier 2018

Using reflection on generics recursively

I have the following classes:

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
{

}

And a few helper methods:

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);
}

What I'm trying to do is implement a property called HaveChildRecordsChanged using reflection. My question is how would I go about using reflection to check the HasDataChanged property of all ChildRecords of arbitrary depth?

I tried something like:

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;   





Aucun commentaire:

Enregistrer un commentaire