Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// 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);
}
}
// 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
- ScriptResourceAttribute.cs
- TextServicesDisplayAttributePropertyRanges.cs
- EnlistmentTraceIdentifier.cs
- SqlUnionizer.cs
- TransactionCache.cs
- HostedBindingBehavior.cs
- InstanceLockedException.cs
- JavaScriptObjectDeserializer.cs
- SortAction.cs
- XmlSchemaAttributeGroup.cs
- MethodAccessException.cs
- VectorAnimationBase.cs
- TraceFilter.cs
- Section.cs
- InputScope.cs
- DistinctQueryOperator.cs
- DataKeyCollection.cs
- SyndicationDeserializer.cs
- Comparer.cs
- BinaryFormatterWriter.cs
- HttpListener.cs
- DbConvert.cs
- MessageBodyMemberAttribute.cs
- TextParagraphProperties.cs
- Odbc32.cs
- ComboBoxAutomationPeer.cs
- BrowserInteropHelper.cs
- JsonQueryStringConverter.cs
- ThicknessConverter.cs
- PropertyPathConverter.cs
- ProcessHostServerConfig.cs
- AttributeEmitter.cs
- RuleInfoComparer.cs
- LocalIdKeyIdentifierClause.cs
- DBConcurrencyException.cs
- ArgumentOutOfRangeException.cs
- InitiatorSessionSymmetricMessageSecurityProtocol.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- SessionStateContainer.cs
- SafeHandle.cs
- ToolZone.cs
- ResourceDisplayNameAttribute.cs
- ColorMap.cs
- TypeBuilder.cs
- EncodingInfo.cs
- BitArray.cs
- XamlStackWriter.cs
- CodeVariableDeclarationStatement.cs
- StringStorage.cs
- XmlEntityReference.cs
- SerializationEventsCache.cs
- TextTreePropertyUndoUnit.cs
- ListItem.cs
- IdentifierService.cs
- EnumBuilder.cs
- TextElementEnumerator.cs
- ThousandthOfEmRealDoubles.cs
- DataGridViewCellStyleConverter.cs
- HtmlInputRadioButton.cs
- GregorianCalendar.cs
- DataSvcMapFileSerializer.cs
- ChildTable.cs
- ReaderOutput.cs
- X509Certificate2.cs
- DataGridPageChangedEventArgs.cs
- MatrixKeyFrameCollection.cs
- PixelShader.cs
- CompilerError.cs
- SqlException.cs
- DataGridViewCellValueEventArgs.cs
- DelegateSerializationHolder.cs
- StyleXamlTreeBuilder.cs
- DataListItem.cs
- SrgsDocumentParser.cs
- SpellerHighlightLayer.cs
- ThaiBuddhistCalendar.cs
- TransactionInformation.cs
- TimeSpanStorage.cs
- FlowDocumentFormatter.cs
- CaseInsensitiveComparer.cs
- ObjectCacheHost.cs
- WindowsFont.cs
- IpcChannelHelper.cs
- GlobalEventManager.cs
- QueryContinueDragEvent.cs
- ToolStripMenuItem.cs
- BulletedList.cs
- ElementsClipboardData.cs
- PointConverter.cs
- IssuedTokenClientBehaviorsElementCollection.cs
- ConfigurationProviderException.cs
- Int32AnimationBase.cs
- CompilerError.cs
- AppDomainFactory.cs
- HMACSHA1.cs
- ClipboardData.cs
- CalendarDataBindingHandler.cs
- StrokeNode.cs
- ISCIIEncoding.cs
- PriorityRange.cs