| File: System\Reflection\Context\CustomReflectionContext.Projector.cs | Web Access |
| Project: src\runtime\src\libraries\System.Reflection.Context\src\System.Reflection.Context.csproj (System.Reflection.Context) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Reflection.Context.Custom; using System.Reflection.Context.Projection; namespace System.Reflection.Context { public partial class CustomReflectionContext { private sealed class ReflectionContextProjector : Projector { public ReflectionContextProjector(CustomReflectionContext context) { ReflectionContext = context; } public CustomReflectionContext ReflectionContext { get; } public TypeInfo ProjectTypeIfNeeded(TypeInfo value) { if (NeedsProjection(value)) { // Map the assembly to the underlying context first Debug.Assert(ReflectionContext.SourceContext != null); value = ReflectionContext.SourceContext.MapType(value); return ProjectType(value); } else return value; } public Assembly ProjectAssemblyIfNeeded(Assembly value) { if (NeedsProjection(value)) { // Map the assembly to the underlying context first Debug.Assert(ReflectionContext.SourceContext != null); value = ReflectionContext.SourceContext.MapAssembly(value); return ProjectAssembly(value); } else return value; } [return: NotNullIfNotNull(nameof(value))] public override TypeInfo? ProjectType(Type? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomType(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override Assembly? ProjectAssembly(Assembly? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomAssembly(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override Module? ProjectModule(Module? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomModule(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override FieldInfo? ProjectField(FieldInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomFieldInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override EventInfo? ProjectEvent(EventInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomEventInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override ConstructorInfo? ProjectConstructor(ConstructorInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomConstructorInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override MethodInfo? ProjectMethod(MethodInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomMethodInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override MethodBase? ProjectMethodBase(MethodBase? value) { if (value == null) return null; MethodInfo? method = value as MethodInfo; if (method != null) return ProjectMethod(method); ConstructorInfo? constructor = value as ConstructorInfo; if (constructor != null) return ProjectConstructor(constructor); throw new InvalidOperationException(SR.Format(SR.InvalidOperation_InvalidMethodType, value.GetType())); } [return: NotNullIfNotNull(nameof(value))] public override PropertyInfo? ProjectProperty(PropertyInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomPropertyInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override ParameterInfo? ProjectParameter(ParameterInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new CustomParameterInfo(value, ReflectionContext); } [return: NotNullIfNotNull(nameof(value))] public override MethodBody? ProjectMethodBody(MethodBody? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new ProjectingMethodBody(value, this); } [return: NotNullIfNotNull(nameof(value))] public override LocalVariableInfo? ProjectLocalVariable(LocalVariableInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new ProjectingLocalVariableInfo(value, this); } [return: NotNullIfNotNull(nameof(value))] public override ExceptionHandlingClause? ProjectExceptionHandlingClause(ExceptionHandlingClause? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new ProjectingExceptionHandlingClause(value, this); } [return: NotNullIfNotNull(nameof(value))] public override CustomAttributeData? ProjectCustomAttributeData(CustomAttributeData? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new ProjectingCustomAttributeData(value, this); } [return: NotNullIfNotNull(nameof(value))] public override ManifestResourceInfo? ProjectManifestResource(ManifestResourceInfo? value) { if (value == null) return null; Debug.Assert(NeedsProjection(value)); return new ProjectingManifestResourceInfo(value, this); } [return: NotNullIfNotNull(nameof(value))] public override MemberInfo? ProjectMember(MemberInfo? value) { if (value == null) return null; MemberInfo? output; switch (value.MemberType) { case MemberTypes.TypeInfo: case MemberTypes.NestedType: output = ProjectType((Type)value); break; case MemberTypes.Constructor: output = ProjectConstructor((ConstructorInfo)value); break; case MemberTypes.Event: output = ProjectEvent((EventInfo)value); break; case MemberTypes.Field: output = ProjectField((FieldInfo)value); break; case MemberTypes.Method: output = ProjectMethod((MethodInfo)value); break; case MemberTypes.Property: output = ProjectProperty((PropertyInfo)value); break; default: throw new InvalidOperationException(SR.Format(SR.InvalidOperation_InvalidMemberType, value.Name, value.MemberType)); } return output; } public override CustomAttributeTypedArgument ProjectTypedArgument(CustomAttributeTypedArgument value) { Type? argumentType = ProjectType(value.ArgumentType); return new CustomAttributeTypedArgument(argumentType, value.Value); } public override CustomAttributeNamedArgument ProjectNamedArgument(CustomAttributeNamedArgument value) { MemberInfo member = ProjectMember(value.MemberInfo); CustomAttributeTypedArgument typedArgument = ProjectTypedArgument(value.TypedValue); return new CustomAttributeNamedArgument(member, typedArgument); } public override InterfaceMapping ProjectInterfaceMapping(InterfaceMapping value) { return new InterfaceMapping { InterfaceMethods = Project(value.InterfaceMethods, ProjectMethod), InterfaceType = ProjectType(value.InterfaceType), TargetMethods = Project(value.TargetMethods, ProjectMethod), TargetType = ProjectType(value.TargetType) }; } } } }