27.09.2018 [Reflection] свойства
 
Нужно для некоего класса получить набор всех полей и свойств.
С полями всё вроде бы просто и понятно, а со свойствами есть нюанс:
они могут быть виртуальные, они могут перегружаться через new или являться реализацией какого-либо интерфейса.

Скажем, есть такие классы:

public interface IA
{
string Property { get; }
}

public class A: IA
{
private string _property;

public virtual int VirtualProperty { get; set; }
public string Property { get => _property; set => _property = value; }
}

public class B: A
{
private string _property2;

public override int VirtualProperty { get => base.VirtualProperty; set => base.VirtualProperty = value + 1; }
new public string Property { get => _property2; set => _property2 = value; }
}

Для класса B нужно получить 3 PropertyInfo.
один VirtualProperty, и два для Property.
ЗЫ. VirtualProperty один потому что он "нормальный" виртуальный и даже если его получить для класса A, у него правильно отработает SetValue, вызвав метод из класса B.
Можно конечно забить и получить 4 свойства, но тогда дважды будет выполняться работа для виртуальных свойств.