Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / TypedReference.cs / 1305376 / TypedReference.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System { // TypedReference is basically only ever seen on the call stack, and in param arrays. // These are blob that must be dealt with by the compiler. using System; using System.Reflection; using System.Runtime.CompilerServices; using CultureInfo = System.Globalization.CultureInfo; using FieldInfo = System.Reflection.FieldInfo; using System.Security.Permissions; using System.Runtime.Versioning; using System.Diagnostics.Contracts; [CLSCompliant(false)] [System.Runtime.InteropServices.ComVisible(true)] public struct TypedReference { private IntPtr Value; private IntPtr Type; [System.Security.SecurityCritical] // auto-generated_required [CLSCompliant(false)] public static TypedReference MakeTypedReference(Object target, FieldInfo[] flds) { if (target == null) throw new ArgumentNullException("target"); if (flds == null) throw new ArgumentNullException("flds"); Contract.EndContractBlock(); if (flds.Length == 0) throw new ArgumentException(Environment.GetResourceString("Arg_ArrayZeroError")); else { IntPtr[] fields = new IntPtr[flds.Length]; // For proper handling of Nullabledon't change GetType() to something like 'IsAssignableFrom' // Currently we can't make a TypedReference to fields of Nullable , which is fine. Type targetType = target.GetType(); for (int i = 0; i < flds.Length; i++) { FieldInfo field = flds[i]; if (!(field is RuntimeFieldInfo)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeFieldInfo")); else if (field.IsInitOnly || field.IsStatic) throw new ArgumentException(Environment.GetResourceString("Argument_TypedReferenceInvalidField")); if (targetType != field.DeclaringType && !targetType.IsSubclassOf(field.DeclaringType)) throw new MissingMemberException(Environment.GetResourceString("MissingMemberTypeRef")); Type fieldType = field.FieldType; if (fieldType.IsPrimitive) throw new ArgumentException(Environment.GetResourceString("Arg_TypeRefPrimitve")); if (i < flds.Length - 1) if (!fieldType.IsValueType) throw new MissingMemberException(Environment.GetResourceString("MissingMemberNestErr")); fields[i] = field.FieldHandle.Value; targetType = fieldType; } TypedReference result = new TypedReference (); // reference to TypedReference is banned, so have to pass result as pointer unsafe { InternalMakeTypedReference(&result, target, fields, targetType.TypeHandle.GetRuntimeType()); } return result; } } [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] // reference to TypedReference is banned, so have to pass result as pointer private unsafe static extern void InternalMakeTypedReference(void* result, Object target, IntPtr[] flds, RuntimeType lastFieldType); public override int GetHashCode() { if (Type == IntPtr.Zero) return 0; else return __reftype(this).GetHashCode(); } public override bool Equals(Object o) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NYI")); } [System.Security.SecuritySafeCritical] // auto-generated public unsafe static Object ToObject(TypedReference value) { return InternalToObject(&value); } [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] internal unsafe extern static Object InternalToObject(void * value); internal bool IsNull { get { return Value.IsNull() && Type.IsNull(); } } public static Type GetTargetType (TypedReference value) { return __reftype(value); } public static RuntimeTypeHandle TargetTypeToken (TypedReference value) { return __reftype(value).TypeHandle; } // This may cause the type to be changed. [System.Security.SecuritySafeCritical] // auto-generated [CLSCompliant(false)] public unsafe static void SetTypedReference(TypedReference target, Object value) { InternalSetTypedReference(&target, value); } [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] internal unsafe extern static void InternalSetTypedReference(void * target, Object value); // Internal method for getting a raw pointer for handles in JitHelpers. // The reference has to point into a local stack variable in order so it can not be moved by the GC. [System.Security.SecurityCritical] // auto-generated internal IntPtr GetPointerOnStack() { #if _DEBUG Contract.Assert(IsAddressInStack(Value), "Pointer not in the stack!"); #endif return Value; } #if _DEBUG [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] extern static bool IsAddressInStack(IntPtr ptr); #endif } } // 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
- FontUnit.cs
- LOSFormatter.cs
- SocketConnection.cs
- CodeSubDirectory.cs
- ContentControl.cs
- DelimitedListTraceListener.cs
- ScriptDescriptor.cs
- XmlComment.cs
- DataGridViewTopLeftHeaderCell.cs
- EnumUnknown.cs
- BatchStream.cs
- ObjectNotFoundException.cs
- DataTransferEventArgs.cs
- HttpPostedFile.cs
- IndexedString.cs
- ActivationWorker.cs
- FixedPosition.cs
- BitStack.cs
- WindowsListViewItemStartMenu.cs
- BindingUtils.cs
- BooleanAnimationBase.cs
- ResXResourceWriter.cs
- XamlReaderHelper.cs
- RenderDataDrawingContext.cs
- SafeSecurityHelper.cs
- Triangle.cs
- SkipQueryOptionExpression.cs
- DataGridViewLinkCell.cs
- PrintEvent.cs
- EntityDataSourceContainerNameItem.cs
- SecUtil.cs
- WorkflowServiceHost.cs
- Util.cs
- HighContrastHelper.cs
- WbemProvider.cs
- KoreanLunisolarCalendar.cs
- ResetableIterator.cs
- PoisonMessageException.cs
- SqlConnection.cs
- CapabilitiesPattern.cs
- SchemaNotation.cs
- SimpleTypesSurrogate.cs
- BlobPersonalizationState.cs
- LabelEditEvent.cs
- LinearKeyFrames.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- PublisherIdentityPermission.cs
- DependencyPropertyDescriptor.cs
- ContextQuery.cs
- ConfigurationLocation.cs
- EventPrivateKey.cs
- DPTypeDescriptorContext.cs
- ListParagraph.cs
- DataColumnPropertyDescriptor.cs
- ObjectHelper.cs
- AcceptorSessionSymmetricMessageSecurityProtocol.cs
- TemplatePagerField.cs
- NonParentingControl.cs
- BitmapPalettes.cs
- DocumentGrid.cs
- DESCryptoServiceProvider.cs
- SourceFileInfo.cs
- SafeNativeMethods.cs
- ContextMenuStripGroupCollection.cs
- VisualBrush.cs
- Regex.cs
- MetafileEditor.cs
- IxmlLineInfo.cs
- Stylesheet.cs
- NamespaceListProperty.cs
- SqlProvider.cs
- XmlWrappingReader.cs
- DBCommandBuilder.cs
- SoapInteropTypes.cs
- SmtpNtlmAuthenticationModule.cs
- TokenBasedSet.cs
- BufferedStream.cs
- Button.cs
- DynamicQueryableWrapper.cs
- CheckBoxRenderer.cs
- FixedSOMPageConstructor.cs
- TCPListener.cs
- GAC.cs
- LineSegment.cs
- NoResizeHandleGlyph.cs
- FormViewInsertEventArgs.cs
- MethodBuilderInstantiation.cs
- AuthorizationSection.cs
- SqlXmlStorage.cs
- ExpressionPrefixAttribute.cs
- GenericParameterDataContract.cs
- KnownColorTable.cs
- BamlTreeNode.cs
- WebPartZoneBaseDesigner.cs
- Viewport3DAutomationPeer.cs
- EpmContentSerializer.cs
- CacheMemory.cs
- ProcessInfo.cs
- CodeTypeDeclarationCollection.cs
- XomlCompilerResults.cs