Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Metadata / Edm / FacetValueContainer.cs / 1305376 / FacetValueContainer.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace System.Data.Metadata.Edm { ////// This Class is never expected to be used except for by the FacetValues class. /// /// The purpose of this class is to allow strong type checking by the compiler while setting facet values which /// are typically stored as Object because they can either on of these things /// /// 1. null /// 2. scalar type (bool, int, byte) /// 3. Unbounded object /// /// without this class it would be very easy to accidentally set precision to an int when it really is supposed to be /// a byte value. Also you would be able to set the facet value to any Object derived class (ANYTHING!!!) when really only /// null and Unbounded are allowed besides an actual scalar value. The magic of the class happens in the implicit constructors with /// allow patterns like /// /// new FacetValues( MaxLength = EdmConstants.UnboundedValue, Nullable = true}; /// /// and these are type checked at compile time /// ///internal struct FacetValueContainer { T _value; bool _hasValue; bool _isUnbounded; internal T Value { set { _isUnbounded = false; _hasValue = true; _value = value; } } private void SetUnbounded() { _isUnbounded = true; _hasValue = true; } // don't add an implicit conversion from object because it will kill the compile time type checking. public static implicit operator FacetValueContainer (System.Data.Metadata.Edm.EdmConstants.Unbounded unbounded) { Debug.Assert(object.ReferenceEquals(unbounded, EdmConstants.UnboundedValue), "you must pass the unbounded value. If you are trying to set null, use the T parameter overload"); FacetValueContainer container = new FacetValueContainer (); container.SetUnbounded(); return container; } public static implicit operator FacetValueContainer (T value) { FacetValueContainer container = new FacetValueContainer (); container.Value = value; return container; } internal object GetValueAsObject() { Debug.Assert(_hasValue, "Don't get the value if it has not been set"); if (_isUnbounded) { return EdmConstants.UnboundedValue; } else { return (object)_value; } } internal bool HasValue { get { return _hasValue; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace System.Data.Metadata.Edm { ////// This Class is never expected to be used except for by the FacetValues class. /// /// The purpose of this class is to allow strong type checking by the compiler while setting facet values which /// are typically stored as Object because they can either on of these things /// /// 1. null /// 2. scalar type (bool, int, byte) /// 3. Unbounded object /// /// without this class it would be very easy to accidentally set precision to an int when it really is supposed to be /// a byte value. Also you would be able to set the facet value to any Object derived class (ANYTHING!!!) when really only /// null and Unbounded are allowed besides an actual scalar value. The magic of the class happens in the implicit constructors with /// allow patterns like /// /// new FacetValues( MaxLength = EdmConstants.UnboundedValue, Nullable = true}; /// /// and these are type checked at compile time /// ///internal struct FacetValueContainer { T _value; bool _hasValue; bool _isUnbounded; internal T Value { set { _isUnbounded = false; _hasValue = true; _value = value; } } private void SetUnbounded() { _isUnbounded = true; _hasValue = true; } // don't add an implicit conversion from object because it will kill the compile time type checking. public static implicit operator FacetValueContainer (System.Data.Metadata.Edm.EdmConstants.Unbounded unbounded) { Debug.Assert(object.ReferenceEquals(unbounded, EdmConstants.UnboundedValue), "you must pass the unbounded value. If you are trying to set null, use the T parameter overload"); FacetValueContainer container = new FacetValueContainer (); container.SetUnbounded(); return container; } public static implicit operator FacetValueContainer (T value) { FacetValueContainer container = new FacetValueContainer (); container.Value = value; return container; } internal object GetValueAsObject() { Debug.Assert(_hasValue, "Don't get the value if it has not been set"); if (_isUnbounded) { return EdmConstants.UnboundedValue; } else { return (object)_value; } } internal bool HasValue { get { return _hasValue; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OutputCacheProfileCollection.cs
- ApplicationId.cs
- LinqDataSourceDisposeEventArgs.cs
- XmlTypeMapping.cs
- SimpleTextLine.cs
- ClockController.cs
- AssemblyUtil.cs
- PrintPreviewControl.cs
- DataGridPageChangedEventArgs.cs
- XpsS0ValidatingLoader.cs
- DatagramAdapter.cs
- EntityKeyElement.cs
- SafeReversePInvokeHandle.cs
- CharacterBufferReference.cs
- XmlSchemaSimpleTypeUnion.cs
- AxHost.cs
- PopupControlService.cs
- DocumentXmlWriter.cs
- PerformanceCounter.cs
- Helpers.cs
- PrefixQName.cs
- WarningException.cs
- StylusButtonCollection.cs
- WindowsFont.cs
- UnsafeNativeMethods.cs
- ColorKeyFrameCollection.cs
- DataBindingCollection.cs
- _NegotiateClient.cs
- StringFunctions.cs
- BamlRecordWriter.cs
- EncoderReplacementFallback.cs
- UnsafeNativeMethodsPenimc.cs
- LinkArea.cs
- XmlQualifiedName.cs
- SqlInternalConnectionTds.cs
- SecurityAccessDeniedException.cs
- Animatable.cs
- ThemeConfigurationDialog.cs
- EditorAttributeInfo.cs
- ObjectItemConventionAssemblyLoader.cs
- ToolStripPanelRow.cs
- DebugView.cs
- ConstraintManager.cs
- GenericsInstances.cs
- LinearGradientBrush.cs
- DBBindings.cs
- VBIdentifierName.cs
- TableCell.cs
- ViewStateException.cs
- JsonSerializer.cs
- UserControlDocumentDesigner.cs
- View.cs
- DataGridItemAutomationPeer.cs
- Model3D.cs
- StreamGeometry.cs
- ClientSettings.cs
- EncryptedPackage.cs
- FileRecordSequenceHelper.cs
- RepeatBehavior.cs
- TextBoxAutomationPeer.cs
- DataPager.cs
- AspProxy.cs
- ApplicationInterop.cs
- BooleanFunctions.cs
- TextDecoration.cs
- MethodAccessException.cs
- TemplateBindingExpression.cs
- StringWriter.cs
- PropertyToken.cs
- Switch.cs
- ChannelServices.cs
- XPathChildIterator.cs
- CodeCompileUnit.cs
- MachineKey.cs
- DocumentViewerBase.cs
- BaseResourcesBuildProvider.cs
- FixedNode.cs
- IntSecurity.cs
- FrameDimension.cs
- UICuesEvent.cs
- XmlWellformedWriter.cs
- EntityTemplateUserControl.cs
- InputLangChangeRequestEvent.cs
- TemplateBindingExtensionConverter.cs
- XmlValidatingReader.cs
- ElementNotAvailableException.cs
- XPathArrayIterator.cs
- IconConverter.cs
- PointConverter.cs
- DefaultEvaluationContext.cs
- TypeForwardedToAttribute.cs
- PropertyNames.cs
- SymbolMethod.cs
- UserInitiatedNavigationPermission.cs
- StreamUpdate.cs
- Resources.Designer.cs
- _NegoState.cs
- StreamingContext.cs
- PartialCachingAttribute.cs
- FragmentQueryKB.cs