static IEnumerable<PropertyInfo> GetAllProperties(Type type)
{
var props = new List<PropertyInfo>(type.GetProperties());
foreach (var interfaceType in type.GetInterfaces())
{
props.AddRange(GetAllProperties(interfaceType));
}
var tracked = new List<PropertyInfo>(props.Count);
var duplicates = new List<PropertyInfo>(props.Count);
foreach (var p in props)
{
var duplicate = tracked.SingleOrDefault(n => n.Name == p.Name && n.PropertyType == p.PropertyType);
if (duplicate != null)
{
duplicates.Add(p);
}
else
{
tracked.Add(p);
}
}
foreach (var d in duplicates)
{
props.Remove(d);
}
return props;
}