Для получения свойств типа мы будем использовать:
Type classType = typeof(TestClass);
PropertyInfo[] properties = classType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
Чтобы получить атрибуты, определенные для класса, мы будем использовать:
Type classType = typeof(TestClass);
object[] attributes = classType.GetCustomAttributes(false);
Передан логический флаг, являющийся флагом наследования, независимо от того, выполняется поиск в цепочке наследования или нет.
Для получения атрибутов свойства мы будем использовать:
propertyInfo.GetCustomAttributes(false);
Используя код Гарварда, указанный выше:
Type classType = typeof(TestClass);
object[] classAttributes = classType.GetCustomAttributes(false);
foreach(PropertyInfo property in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
object[] propertyAttributes = property.GetCustomAttributes(false);
Console.WriteLine(property.Name);
}