private static T GetPropertyValue <T>(this IEdmModel model, IEdmStructuredValue context, IEdmEntityType contextType, IEdmTerm term, IEdmProperty property, string qualifier, Func <IEdmExpression, IEdmStructuredValue, T> evaluator)
        {
            IEnumerable <IEdmVocabularyAnnotation> annotations = model.FindVocabularyAnnotations <IEdmVocabularyAnnotation>(contextType, term, qualifier);

            if (annotations.Count() != 1)
            {
                throw new InvalidOperationException("Type " + contextType.ToTraceString() + " must have a single annotation with term " + term.ToTraceString());
            }

            var annotationValue = annotations.Single().Value as IEdmRecordExpression;

            if (annotationValue == null)
            {
                throw new InvalidOperationException("Type " + contextType.ToTraceString() + " must have a single annotation containing a record expression with term " + term.ToTraceString());
            }

            var propertyConstructor = annotationValue.FindProperty(property.Name);

            return(propertyConstructor != null?evaluator(propertyConstructor.Value, context) : default(T));
        }