I would use AllPropertiesExcept(params Expression<Func<object>>[] properties), you can still get property names from it, but no matter what type the property has.
: , - , , , . : , - Func, .
2 ( ):
Expression<Func<object>> obj = something;
((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name
LinqPad , Dump(), , . .