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
- FederatedMessageSecurityOverHttp.cs
- DynamicValueConverter.cs
- MSG.cs
- Normalization.cs
- SelectionRange.cs
- SafeNativeMethods.cs
- odbcmetadatacolumnnames.cs
- WebServiceFault.cs
- SessionParameter.cs
- SessionSwitchEventArgs.cs
- HostingEnvironmentException.cs
- EntitySet.cs
- ConfigXmlComment.cs
- ThrowHelper.cs
- ProtocolsConfigurationEntry.cs
- IntegerValidator.cs
- HostedImpersonationContext.cs
- GroupBox.cs
- XmlSerializationWriter.cs
- SmiContext.cs
- PhysicalAddress.cs
- InternalConfigHost.cs
- FixedPageAutomationPeer.cs
- ToolStripItemEventArgs.cs
- NetMsmqBindingCollectionElement.cs
- RefreshResponseInfo.cs
- FixedPageAutomationPeer.cs
- ClientTarget.cs
- HtmlShim.cs
- Part.cs
- BinHexDecoder.cs
- EmissiveMaterial.cs
- SpellerStatusTable.cs
- AnnotationResourceChangedEventArgs.cs
- ToolboxItemImageConverter.cs
- TrustManagerMoreInformation.cs
- AttributeTableBuilder.cs
- ScriptControl.cs
- SerialErrors.cs
- IntSecurity.cs
- NamespaceMapping.cs
- D3DImage.cs
- ClaimTypes.cs
- DesignerForm.cs
- TargetParameterCountException.cs
- EraserBehavior.cs
- DateRangeEvent.cs
- input.cs
- XPathParser.cs
- ToolStripStatusLabel.cs
- ParameterElement.cs
- PropertyHelper.cs
- Camera.cs
- GroupQuery.cs
- EdmRelationshipRoleAttribute.cs
- TreeSet.cs
- SubMenuStyleCollection.cs
- ValidationRuleCollection.cs
- TextTreeDeleteContentUndoUnit.cs
- DbConnectionPoolIdentity.cs
- AuthorizationSection.cs
- ObjectDisposedException.cs
- ThemeableAttribute.cs
- WebPartExportVerb.cs
- GenericAuthenticationEventArgs.cs
- MarshalByValueComponent.cs
- UpdatePanelTriggerCollection.cs
- Int64.cs
- QuadraticBezierSegment.cs
- IArgumentProvider.cs
- FileRegion.cs
- ChildTable.cs
- BaseResourcesBuildProvider.cs
- XmlSchemaSet.cs
- Latin1Encoding.cs
- TypeDelegator.cs
- ProvidePropertyAttribute.cs
- ILGen.cs
- OleDbWrapper.cs
- BitmapMetadataEnumerator.cs
- BindingSource.cs
- StylusPointPropertyInfo.cs
- XmlWriter.cs
- HtmlLiteralTextAdapter.cs
- DBConnection.cs
- ProfileService.cs
- PropertyNames.cs
- GeneralTransformCollection.cs
- VersionedStreamOwner.cs
- SqlNotificationEventArgs.cs
- DateTimeSerializationSection.cs
- BamlVersionHeader.cs
- NameValueSectionHandler.cs
- Method.cs
- RuntimeConfigurationRecord.cs
- Rect3D.cs
- DataControlFieldCollection.cs
- XamlTypeMapperSchemaContext.cs
- StringValidator.cs
- GenerateTemporaryTargetAssembly.cs