internal static XTypedElement GetAnnotation(Type t, XElement xe)
        {
            XTypedElementWrapperAnnotation xoWrapperAnnotation = xe.Annotation <XTypedElementWrapperAnnotation>();
            XTypedElement xObj = null;

            if (xoWrapperAnnotation != null)
            {
                //Return the root type if the element is annotated with the root
                xObj = xoWrapperAnnotation.typedElement;
                if (t.IsAssignableFrom(xObj.GetType()))
                {
                    //Check if we are asking for element wrapper
                    return(xObj);
                }
            }

            XTypedElementAnnotation xoAnnotation = xe.Annotation <XTypedElementAnnotation>();

            if (xoAnnotation != null)
            {
                xObj = xoAnnotation.typedElement;
                if (t.IsAssignableFrom(xObj.GetType()))
                {
                    //Check if we are asking for type
                    return(xObj);
                }
            }

            return(null);
        }
        internal static XTypedElement GetAnnotation(Type t, XElement xe)
        {
            XTypedElement xTypedElement;
            XTypedElementWrapperAnnotation xoWrapperAnnotation = xe.Annotation <XTypedElementWrapperAnnotation>();
            XTypedElement xObj = null;

            if (xoWrapperAnnotation != null)
            {
                xObj = xoWrapperAnnotation.typedElement;
                if (t.IsAssignableFrom(xObj.GetType()))
                {
                    xTypedElement = xObj;
                    return(xTypedElement);
                }
            }
            XTypedElementAnnotation xoAnnotation = xe.Annotation <XTypedElementAnnotation>();

            if (xoAnnotation != null)
            {
                xObj = xoAnnotation.typedElement;
                if (t.IsAssignableFrom(xObj.GetType()))
                {
                    xTypedElement = xObj;
                    return(xTypedElement);
                }
            }
            xTypedElement = null;
            return(xTypedElement);
        }
        public static XTypedElement GetCloneIfRooted(XTypedElement innerType)
        {
            if (innerType == null)
            {
                throw new ArgumentNullException("Argument innerType should not be null.");
            }

            XElement fragment = innerType.Untyped;
            XTypedElementWrapperAnnotation wrapperAnnotation = fragment.Annotation <XTypedElementWrapperAnnotation>();

            if (wrapperAnnotation != null)
            {
                //Already rooted to a wrapper
                return(innerType.Clone());
            }
            else
            {
                return(innerType);
            }
        }