PropertyInfo[] properties = entity.GetType().GetProperties()
.Where(p => p.GetMethod.IsVirtual).ToArray();
O, para .NET 4 y abajo:
PropertyInfo[] properties = entity.GetType().GetProperties()
.Where(p => p.GetGetMethod().IsVirtual).ToArray();
que conseguirá una lista de public virtual propiedades.
No funcionará para propiedades de solo escritura. Si es necesario, puede marcar CanRead
y CanWrite
manualmente y leer el método apropiado.
Por ejemplo:
PropertyInfo[] properties = entity.GetType().GetProperties()
.Where(p => (p.CanRead ? p.GetMethod : p.SetMethod).IsVirtual).ToArray();
También puedes, simplemente agarrar el primer descriptor de acceso:
PropertyInfo[] properties = entity.GetType().GetProperties()
.Where(p => p.GetAccessors()[0].IsVirtual).ToArray();
ser manejado con seguridad las propiedades privadas que puede hacer: '(p.CanRead p.GetGetMethod (verdadero):? P.GetSetMethod (verdadero)). IsVirtual;' –