private static MemberInfo[] BuildPublicReadAccessors(IEnumerable<MemberInfo> allMembers)
{
// Multiple types may define the same property (e.g. the class and multiple interfaces) - filter this to one of those properties
var filteredMembers = allMembers
.OfType<PropertyInfo>()
.GroupBy(x => x.Name) // group properties of the same name together
.Select(x => x.First())
.OfType<MemberInfo>() // cast back to MemberInfo so we can add back FieldInfo objects
.Concat(allMembers.Where(x => x is FieldInfo)); // add FieldInfo objects back
return filteredMembers.ToArray();
}