mardi 25 août 2015

Recursive reflection through object

I have method that walks through a class and checks if 2 objects has the same values.

private bool LoopThroughObjects<T>(T ob1, T ob2)
{
    Type type = ob1.GetType();
    System.Reflection.PropertyInfo[] props = type.GetProperties();

    foreach (var prop in props)
    {
        object ent1value = prop.GetValue(ob1, new object[] { });
        object ent2value = prop.GetValue(ob2, new object[] { });

        //If object is in the same namespace it's a nested element
        if(IsSameNameSpace(type.Namespace, prop.PropertyType.Namespace))
        {
            _depth++;
            ValidateEntity_AttributesNotSame(ent1value, ent2value);
        }
        else
            ComparerOutput.Add(_conjunction + prop.Name, ent1value.Equals(ent2value));

        if (BreakOnUnequally)
            if (!ent1value.Equals(ent2value))
                return false;
    }
    return true;
}

A example of an object that I can send:

public class RefelctionTestEntity
{
    public int Id { get; set; }
    public String Firstname { get; set; }
    public String Lastname { get; set; }
    public int Age { get; set; }
    public RefelctionTestEntity Child { get; set;}
    public Vehicle.Bikes Bike { get; set; }
}

I walk recursively through the object so I will also check the Child en the Bike. My question is what's the best methode to check these inner objects? What I do at this moment is check the namespace of the object against the parent namespace of the inner object:

private bool IsSameNameSpace(String baseNamespace, String propertyNamespace)
{
    if (String.IsNullOrEmpty(baseNamespace) || String.IsNullOrEmpty(propertyNamespace))
        return true;

    if (String.IsNullOrEmpty(baseNamespace) || String.IsNullOrEmpty(propertyNamespace))
        return false;

    String[] part = propertyNamespace.Split('.');
    return part[0].Equals(baseNamespace);
}





Aucun commentaire:

Enregistrer un commentaire