Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / TypedReference.cs / 1 / 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;
[CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(true)]
public struct TypedReference
{
private IntPtr Value;
private IntPtr Type;
[CLSCompliant(false)]
[ReflectionPermission(SecurityAction.LinkDemand, MemberAccess=true)]
public static TypedReference MakeTypedReference(Object target, FieldInfo[] flds) {
if (target == null)
throw new ArgumentNullException("target");
if (flds == null)
throw new ArgumentNullException("flds");
if (flds.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Arg_ArrayZeroError"));
else {
RuntimeFieldHandle[] fields = new RuntimeFieldHandle[flds.Length];
// For proper handling of Nullable don'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;
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);
}
return result;
}
}
[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, RuntimeFieldHandle[] flds, RuntimeTypeHandle 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"));
}
public unsafe static Object ToObject(TypedReference value)
{
return InternalToObject(&value);
}
[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.
[CLSCompliant(false)]
public unsafe static void SetTypedReference(TypedReference target, Object value)
{
InternalSetTypedReference(&target, value);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal unsafe extern static void InternalSetTypedReference(void * target, Object value);
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ResourceExpressionBuilder.cs
- PerformanceCounter.cs
- HandlerFactoryCache.cs
- ChineseLunisolarCalendar.cs
- HtmlUtf8RawTextWriter.cs
- SqlRetyper.cs
- SplitterCancelEvent.cs
- SqlNodeTypeOperators.cs
- XmlSchemaDatatype.cs
- EntityDataSourceContainerNameConverter.cs
- DeclaredTypeValidatorAttribute.cs
- URLMembershipCondition.cs
- HotCommands.cs
- Fonts.cs
- XPathCompileException.cs
- JobDuplex.cs
- TextSchema.cs
- CustomLineCap.cs
- RelatedEnd.cs
- TextStore.cs
- ImageCodecInfoPrivate.cs
- FunctionQuery.cs
- TheQuery.cs
- ErrorEventArgs.cs
- MsmqInputChannelListenerBase.cs
- IndexedEnumerable.cs
- UnionCodeGroup.cs
- CounterCreationData.cs
- Size.cs
- DataGridViewBindingCompleteEventArgs.cs
- SortDescription.cs
- AsmxEndpointPickerExtension.cs
- ObjectDataSourceEventArgs.cs
- PeerApplication.cs
- _DomainName.cs
- XmlBaseWriter.cs
- UriSection.cs
- ThreadWorkerController.cs
- PropertyChangingEventArgs.cs
- ResourceExpression.cs
- XPathCompileException.cs
- TextFormatterContext.cs
- PeerContact.cs
- XmlTypeAttribute.cs
- SqlRemoveConstantOrderBy.cs
- ConnectionOrientedTransportBindingElement.cs
- RoleGroupCollection.cs
- BitConverter.cs
- ImageAutomationPeer.cs
- CodeBlockBuilder.cs
- TypeConverterHelper.cs
- WebEvents.cs
- AncillaryOps.cs
- ReadOnlyHierarchicalDataSourceView.cs
- DefaultMergeHelper.cs
- ToolStripItemGlyph.cs
- SingleTagSectionHandler.cs
- Messages.cs
- ControlIdConverter.cs
- RSACryptoServiceProvider.cs
- WebPartEventArgs.cs
- Empty.cs
- ModuleBuilderData.cs
- DrawingGroup.cs
- COM2ComponentEditor.cs
- MarginCollapsingState.cs
- RegionIterator.cs
- XmlSchemaAttributeGroup.cs
- DataServiceRequest.cs
- PowerStatus.cs
- SendActivityDesigner.cs
- TypeTypeConverter.cs
- AudioFormatConverter.cs
- ValidationSummary.cs
- __Error.cs
- SqlConnectionPoolProviderInfo.cs
- CollectionViewGroup.cs
- WindowsSolidBrush.cs
- ScalarOps.cs
- ResourceCollectionInfo.cs
- EmptyImpersonationContext.cs
- PrintDialog.cs
- Vertex.cs
- XamlToRtfWriter.cs
- SolidColorBrush.cs
- StatusBar.cs
- RoamingStoreFile.cs
- Profiler.cs
- X509CertificateStore.cs
- MessageFormatterConverter.cs
- ResolveRequestResponseAsyncResult.cs
- StreamUpdate.cs
- WebBrowserPermission.cs
- OleDbParameter.cs
- OutputCacheSection.cs
- ViewLoader.cs
- ToolStripItemEventArgs.cs
- DocumentPage.cs
- TextEvent.cs
- RouteCollection.cs