// Given an assembly purportedly containing SqlServerTypes for spatial values, attempt to
 // create a corersponding Sql spefic DbSpatialServices value backed by types from that assembly.
 // Uses a dictionary to ensure that there is at most db spatial service per assembly.   It's important that
 // this be done in a way that ensures that the underlying SqlTypesAssembly value is also atomized,
 // since that's caching compilation.
 // Relies on SqlTypesAssembly to verify that the assembly is appropriate.
 private static bool TryGetSpatialServiceFromAssembly(Assembly assembly, out SqlSpatialServices services)
 {
     if (otherSpatialServices == null || !otherSpatialServices.TryGetValue(assembly.FullName, out services))
     {
         lock (Instance)
         {
             if (otherSpatialServices == null || !otherSpatialServices.TryGetValue(assembly.FullName, out services))
             {
                 SqlTypesAssembly sqlAssembly;
                 if (SqlTypesAssembly.TryGetSqlTypesAssembly(assembly, out sqlAssembly))
                 {
                     if (otherSpatialServices == null)
                     {
                         otherSpatialServices = new Dictionary <string, SqlSpatialServices>(1);
                     }
                     services = new SqlSpatialServices(() => sqlAssembly);
                     otherSpatialServices.Add(assembly.FullName, services);
                 }
                 else
                 {
                     services = null;
                 }
             }
         }
     }
     return(services != null);
 }
        private SqlSpatialServices(SerializationInfo info, StreamingContext context)
        {
            SqlSpatialServices instance = Instance;

            this._sqlTypesAssemblySingleton = instance._sqlTypesAssemblySingleton;
            this.InitializeMemberInfo(instance);
        }
 private void InitializeMemberInfo(SqlSpatialServices from)
 {
     this.smi_SqlGeography_Parse              = from.smi_SqlGeography_Parse;
     this.smi_SqlGeography_STGeomFromText     = from.smi_SqlGeography_STGeomFromText;
     this.smi_SqlGeography_STPointFromText    = from.smi_SqlGeography_STPointFromText;
     this.smi_SqlGeography_STLineFromText     = from.smi_SqlGeography_STLineFromText;
     this.smi_SqlGeography_STPolyFromText     = from.smi_SqlGeography_STPolyFromText;
     this.smi_SqlGeography_STMPointFromText   = from.smi_SqlGeography_STMPointFromText;
     this.smi_SqlGeography_STMLineFromText    = from.smi_SqlGeography_STMLineFromText;
     this.smi_SqlGeography_STMPolyFromText    = from.smi_SqlGeography_STMPolyFromText;
     this.smi_SqlGeography_STGeomCollFromText = from.smi_SqlGeography_STGeomCollFromText;
     this.smi_SqlGeography_STGeomFromWKB      = from.smi_SqlGeography_STGeomFromWKB;
     this.smi_SqlGeography_STPointFromWKB     = from.smi_SqlGeography_STPointFromWKB;
     this.smi_SqlGeography_STLineFromWKB      = from.smi_SqlGeography_STLineFromWKB;
     this.smi_SqlGeography_STPolyFromWKB      = from.smi_SqlGeography_STPolyFromWKB;
     this.smi_SqlGeography_STMPointFromWKB    = from.smi_SqlGeography_STMPointFromWKB;
     this.smi_SqlGeography_STMLineFromWKB     = from.smi_SqlGeography_STMLineFromWKB;
     this.smi_SqlGeography_STMPolyFromWKB     = from.smi_SqlGeography_STMPolyFromWKB;
     this.smi_SqlGeography_STGeomCollFromWKB  = from.smi_SqlGeography_STGeomCollFromWKB;
     this.smi_SqlGeography_GeomFromGml        = from.smi_SqlGeography_GeomFromGml;
     this.ipi_SqlGeography_STSrid             = from.ipi_SqlGeography_STSrid;
     this.imi_SqlGeography_STGeometryType     = from.imi_SqlGeography_STGeometryType;
     this.imi_SqlGeography_STDimension        = from.imi_SqlGeography_STDimension;
     this.imi_SqlGeography_STAsBinary         = from.imi_SqlGeography_STAsBinary;
     this.imi_SqlGeography_AsGml              = from.imi_SqlGeography_AsGml;
     this.imi_SqlGeography_STAsText           = from.imi_SqlGeography_STAsText;
     this.imi_SqlGeography_STIsEmpty          = from.imi_SqlGeography_STIsEmpty;
     this.imi_SqlGeography_STEquals           = from.imi_SqlGeography_STEquals;
     this.imi_SqlGeography_STDisjoint         = from.imi_SqlGeography_STDisjoint;
     this.imi_SqlGeography_STIntersects       = from.imi_SqlGeography_STIntersects;
     this.imi_SqlGeography_STBuffer           = from.imi_SqlGeography_STBuffer;
     this.imi_SqlGeography_STDistance         = from.imi_SqlGeography_STDistance;
     this.imi_SqlGeography_STIntersection     = from.imi_SqlGeography_STIntersection;
     this.imi_SqlGeography_STUnion            = from.imi_SqlGeography_STUnion;
     this.imi_SqlGeography_STDifference       = from.imi_SqlGeography_STDifference;
     this.imi_SqlGeography_STSymDifference    = from.imi_SqlGeography_STSymDifference;
     this.imi_SqlGeography_STNumGeometries    = from.imi_SqlGeography_STNumGeometries;
     this.imi_SqlGeography_STGeometryN        = from.imi_SqlGeography_STGeometryN;
     this.ipi_SqlGeography_Lat                = from.ipi_SqlGeography_Lat;
     this.ipi_SqlGeography_Long               = from.ipi_SqlGeography_Long;
     this.ipi_SqlGeography_Z                  = from.ipi_SqlGeography_Z;
     this.ipi_SqlGeography_M                  = from.ipi_SqlGeography_M;
     this.imi_SqlGeography_STLength           = from.imi_SqlGeography_STLength;
     this.imi_SqlGeography_STStartPoint       = from.imi_SqlGeography_STStartPoint;
     this.imi_SqlGeography_STEndPoint         = from.imi_SqlGeography_STEndPoint;
     this.imi_SqlGeography_STIsClosed         = from.imi_SqlGeography_STIsClosed;
     this.imi_SqlGeography_STNumPoints        = from.imi_SqlGeography_STNumPoints;
     this.imi_SqlGeography_STPointN           = from.imi_SqlGeography_STPointN;
     this.imi_SqlGeography_STArea             = from.imi_SqlGeography_STArea;
     this.smi_SqlGeometry_Parse              = from.smi_SqlGeometry_Parse;
     this.smi_SqlGeometry_STGeomFromText     = from.smi_SqlGeometry_STGeomFromText;
     this.smi_SqlGeometry_STPointFromText    = from.smi_SqlGeometry_STPointFromText;
     this.smi_SqlGeometry_STLineFromText     = from.smi_SqlGeometry_STLineFromText;
     this.smi_SqlGeometry_STPolyFromText     = from.smi_SqlGeometry_STPolyFromText;
     this.smi_SqlGeometry_STMPointFromText   = from.smi_SqlGeometry_STMPointFromText;
     this.smi_SqlGeometry_STMLineFromText    = from.smi_SqlGeometry_STMLineFromText;
     this.smi_SqlGeometry_STMPolyFromText    = from.smi_SqlGeometry_STMPolyFromText;
     this.smi_SqlGeometry_STGeomCollFromText = from.smi_SqlGeometry_STGeomCollFromText;
     this.smi_SqlGeometry_STGeomFromWKB      = from.smi_SqlGeometry_STGeomFromWKB;
     this.smi_SqlGeometry_STPointFromWKB     = from.smi_SqlGeometry_STPointFromWKB;
     this.smi_SqlGeometry_STLineFromWKB      = from.smi_SqlGeometry_STLineFromWKB;
     this.smi_SqlGeometry_STPolyFromWKB      = from.smi_SqlGeometry_STPolyFromWKB;
     this.smi_SqlGeometry_STMPointFromWKB    = from.smi_SqlGeometry_STMPointFromWKB;
     this.smi_SqlGeometry_STMLineFromWKB     = from.smi_SqlGeometry_STMLineFromWKB;
     this.smi_SqlGeometry_STMPolyFromWKB     = from.smi_SqlGeometry_STMPolyFromWKB;
     this.smi_SqlGeometry_STGeomCollFromWKB  = from.smi_SqlGeometry_STGeomCollFromWKB;
     this.smi_SqlGeometry_GeomFromGml        = from.smi_SqlGeometry_GeomFromGml;
     this.ipi_SqlGeometry_STSrid             = from.ipi_SqlGeometry_STSrid;
     this.imi_SqlGeometry_STGeometryType     = from.imi_SqlGeometry_STGeometryType;
     this.imi_SqlGeometry_STDimension        = from.imi_SqlGeometry_STDimension;
     this.imi_SqlGeometry_STEnvelope         = from.imi_SqlGeometry_STEnvelope;
     this.imi_SqlGeometry_STAsBinary         = from.imi_SqlGeometry_STAsBinary;
     this.imi_SqlGeometry_AsGml              = from.imi_SqlGeometry_AsGml;
     this.imi_SqlGeometry_STAsText           = from.imi_SqlGeometry_STAsText;
     this.imi_SqlGeometry_STIsEmpty          = from.imi_SqlGeometry_STIsEmpty;
     this.imi_SqlGeometry_STIsSimple         = from.imi_SqlGeometry_STIsSimple;
     this.imi_SqlGeometry_STBoundary         = from.imi_SqlGeometry_STBoundary;
     this.imi_SqlGeometry_STIsValid          = from.imi_SqlGeometry_STIsValid;
     this.imi_SqlGeometry_STEquals           = from.imi_SqlGeometry_STEquals;
     this.imi_SqlGeometry_STDisjoint         = from.imi_SqlGeometry_STDisjoint;
     this.imi_SqlGeometry_STIntersects       = from.imi_SqlGeometry_STIntersects;
     this.imi_SqlGeometry_STTouches          = from.imi_SqlGeometry_STTouches;
     this.imi_SqlGeometry_STCrosses          = from.imi_SqlGeometry_STCrosses;
     this.imi_SqlGeometry_STWithin           = from.imi_SqlGeometry_STWithin;
     this.imi_SqlGeometry_STContains         = from.imi_SqlGeometry_STContains;
     this.imi_SqlGeometry_STOverlaps         = from.imi_SqlGeometry_STOverlaps;
     this.imi_SqlGeometry_STRelate           = from.imi_SqlGeometry_STRelate;
     this.imi_SqlGeometry_STBuffer           = from.imi_SqlGeometry_STBuffer;
     this.imi_SqlGeometry_STDistance         = from.imi_SqlGeometry_STDistance;
     this.imi_SqlGeometry_STConvexHull       = from.imi_SqlGeometry_STConvexHull;
     this.imi_SqlGeometry_STIntersection     = from.imi_SqlGeometry_STIntersection;
     this.imi_SqlGeometry_STUnion            = from.imi_SqlGeometry_STUnion;
     this.imi_SqlGeometry_STDifference       = from.imi_SqlGeometry_STDifference;
     this.imi_SqlGeometry_STSymDifference    = from.imi_SqlGeometry_STSymDifference;
     this.imi_SqlGeometry_STNumGeometries    = from.imi_SqlGeometry_STNumGeometries;
     this.imi_SqlGeometry_STGeometryN        = from.imi_SqlGeometry_STGeometryN;
     this.ipi_SqlGeometry_STX                = from.ipi_SqlGeometry_STX;
     this.ipi_SqlGeometry_STY                = from.ipi_SqlGeometry_STY;
     this.ipi_SqlGeometry_Z                  = from.ipi_SqlGeometry_Z;
     this.ipi_SqlGeometry_M                  = from.ipi_SqlGeometry_M;
     this.imi_SqlGeometry_STLength           = from.imi_SqlGeometry_STLength;
     this.imi_SqlGeometry_STStartPoint       = from.imi_SqlGeometry_STStartPoint;
     this.imi_SqlGeometry_STEndPoint         = from.imi_SqlGeometry_STEndPoint;
     this.imi_SqlGeometry_STIsClosed         = from.imi_SqlGeometry_STIsClosed;
     this.imi_SqlGeometry_STIsRing           = from.imi_SqlGeometry_STIsRing;
     this.imi_SqlGeometry_STNumPoints        = from.imi_SqlGeometry_STNumPoints;
     this.imi_SqlGeometry_STPointN           = from.imi_SqlGeometry_STPointN;
     this.imi_SqlGeometry_STArea             = from.imi_SqlGeometry_STArea;
     this.imi_SqlGeometry_STCentroid         = from.imi_SqlGeometry_STCentroid;
     this.imi_SqlGeometry_STPointOnSurface   = from.imi_SqlGeometry_STPointOnSurface;
     this.imi_SqlGeometry_STExteriorRing     = from.imi_SqlGeometry_STExteriorRing;
     this.imi_SqlGeometry_STNumInteriorRing  = from.imi_SqlGeometry_STNumInteriorRing;
     this.imi_SqlGeometry_STInteriorRingN    = from.imi_SqlGeometry_STInteriorRingN;
 }