В IL оператор switch компилируется во что-то вроде этого:
// ...
L_000c: ldloc.1
L_000d: ldstr "case1"
L_0012: call bool [mscorlib]System.String::op_Equality(string, string)
L_0017: brtrue.s L_0035
L_0019: ldloc.1
L_001a: ldstr "case2"
L_001f: call bool [mscorlib]System.String::op_Equality(string, string)
L_0024: brtrue.s L_0042
L_0026: ldloc.1
L_0027: ldstr "case3"
L_002c: call bool [mscorlib]System.String::op_Equality(string, string)
L_0031: brtrue.s L_004f
// ...
Было бы довольно много работы, чтобы написать код, который мог бы правильно проанализировать это во всех случаях.
Единственный способ проверить это - это охватить все случаи и убедиться, что у вас не будет нулевого PropertyInfo. Если код, с которым вы работаете, очень важен и не может потерпеть неудачу, возможно, в любом случае использовать отражение довольно опасно. Можете ли вы перейти на более безопасный дизайн?