private bool DynamicEquals(object obj1, object obj2)
{
var list1 = Impromptu.GetMemberNames(obj1);
list1 = list1.OrderBy(m => m);
var list2 = Impromptu.GetMemberNames(obj2);
list2 = list2.OrderBy(m => m);
var list = list1 as IList<string> ?? list1.ToList();
if (!list.SequenceEqual(list2))
return false;
return list.All(memberName => Impromptu.InvokeGet(obj1, memberName).Equals(Impromptu.InvokeGet(obj2, memberName)));
}