1: private List<Type> GetMemberTypeChain(Expression expression, bool ignoreCompilerGeneratedTypes)
2: { 3: if (expression == null) return null;
4: if (expression.NodeType == ExpressionType.MemberAccess)
5: { 6: MemberExpression memberExpression = (MemberExpression)expression;
7: var result = GetMemberTypeChain(memberExpression.Expression, ignoreCompilerGeneratedTypes);
8: Type type = memberExpression.Type;
9: if (!(ignoreCompilerGeneratedTypes && IsCompilerGeneratedType(type)))
10: result.Add(type);
11: return result;
12: }
13: else if (expression.NodeType == ExpressionType.Constant || expression.NodeType == ExpressionType.Parameter)
14: { 15: var typeList = new List<CustomTypeInfo>();
16: Type type = expression.Type;
17: if (!(ignoreCompilerGeneratedTypes && IsCompilerGeneratedType(type)))
18: typeList.Add(type);
19: return typeList;
20: }
21: else
22: { 23: throw new NotSupportedException("Expression type not supported: " + expression.GetType().FullName); 24: }
25: }
26:
27: private bool IsCompilerGeneratedType(Type type)
28: { 29: var compilerGenerateds = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), true);
30: return (compilerGenerateds != null && compilerGenerateds.Length > 0);
31: }