Best JustMockLite code snippet using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST.ConvertExpression.Emit
InvocationTypeGenerator.cs
Source:InvocationTypeGenerator.cs
...15{16 using System;17 using System.Collections.Generic;18 using System.Reflection;19 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;20 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.CodeBuilders;21 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;22 using Telerik.JustMock.Core.Castle.DynamicProxy.Internal;23 using Telerik.JustMock.Core.Castle.DynamicProxy.Tokens;24 internal abstract class InvocationTypeGenerator : IGenerator<AbstractTypeEmitter>25 {26 protected readonly MetaMethod method;27 protected readonly Type targetType;28 private readonly MethodInfo callback;29 private readonly bool canChangeTarget;30 private readonly IInvocationCreationContributor contributor;31 protected InvocationTypeGenerator(Type targetType, MetaMethod method, MethodInfo callback, bool canChangeTarget,32 IInvocationCreationContributor contributor)33 {34 this.targetType = targetType;35 this.method = method;36 this.callback = callback;37 this.canChangeTarget = canChangeTarget;38 this.contributor = contributor;39 }40 /// <summary>41 /// Generates the constructor for the class that extends42 /// <see cref = "AbstractInvocation" />43 /// </summary>44 /// <param name = "targetFieldType"></param>45 /// <param name = "proxyGenerationOptions"></param>46 /// <param name = "baseConstructor"></param>47 protected abstract ArgumentReference[] GetBaseCtorArguments(Type targetFieldType,48 ProxyGenerationOptions proxyGenerationOptions,49 out ConstructorInfo baseConstructor);50 protected abstract Type GetBaseType();51 protected abstract FieldReference GetTargetReference();52 public AbstractTypeEmitter Generate(ClassEmitter @class, ProxyGenerationOptions options, INamingScope namingScope)53 {54 var methodInfo = method.Method;55 var interfaces = new Type[0];56 if (canChangeTarget)57 {58 interfaces = new[] { typeof(IChangeProxyTarget) };59 }60 var invocation = GetEmitter(@class, interfaces, namingScope, methodInfo);61 // invocation only needs to mirror the generic parameters of the MethodInfo62 // targetType cannot be a generic type definition (YET!)63 invocation.CopyGenericParametersFromMethod(methodInfo);64 CreateConstructor(invocation, options);65 var targetField = GetTargetReference();66 if (canChangeTarget)67 {68 ImplementChangeProxyTargetInterface(@class, invocation, targetField);69 }70 ImplemementInvokeMethodOnTarget(invocation, methodInfo.GetParameters(), targetField, callback);71#if FEATURE_SERIALIZATION72 invocation.DefineCustomAttribute<SerializableAttribute>();73#endif74 return invocation;75 }76 protected virtual MethodInvocationExpression GetCallbackMethodInvocation(AbstractTypeEmitter invocation,77 Expression[] args, MethodInfo callbackMethod,78 Reference targetField,79 MethodEmitter invokeMethodOnTarget)80 {81 if (contributor != null)82 {83 return contributor.GetCallbackMethodInvocation(invocation, args, targetField, invokeMethodOnTarget);84 }85 var methodOnTargetInvocationExpression = new MethodInvocationExpression(86 new AsTypeReference(targetField, callbackMethod.DeclaringType),87 callbackMethod,88 args) { VirtualCall = true };89 return methodOnTargetInvocationExpression;90 }91 protected virtual void ImplementInvokeMethodOnTarget(AbstractTypeEmitter invocation, ParameterInfo[] parameters,92 MethodEmitter invokeMethodOnTarget,93 Reference targetField)94 {95 var callbackMethod = GetCallbackMethod(invocation);96 if (callbackMethod == null)97 {98 EmitCallThrowOnNoTarget(invokeMethodOnTarget);99 return;100 }101 if (canChangeTarget)102 {103 EmitCallEnsureValidTarget(invokeMethodOnTarget);104 }105 var args = new Expression[parameters.Length];106 // Idea: instead of grab parameters one by one107 // we should grab an array108 var byRefArguments = new Dictionary<int, LocalReference>();109 for (var i = 0; i < parameters.Length; i++)110 {111 var param = parameters[i];112 var paramType = invocation.GetClosedParameterType(param.ParameterType);113 if (paramType.IsByRef)114 {115 var localReference = invokeMethodOnTarget.CodeBuilder.DeclareLocal(paramType.GetElementType());116 invokeMethodOnTarget.CodeBuilder117 .AddStatement(118 new AssignStatement(localReference,119 new ConvertExpression(paramType.GetElementType(),120 new MethodInvocationExpression(SelfReference.Self,121 InvocationMethods.GetArgumentValue,122 new LiteralIntExpression(i)))));123 var byRefReference = new ByRefReference(localReference);124 args[i] = new ReferenceExpression(byRefReference);125 byRefArguments[i] = localReference;126 }127 else128 {129 args[i] =130 new ConvertExpression(paramType,131 new MethodInvocationExpression(SelfReference.Self,132 InvocationMethods.GetArgumentValue,133 new LiteralIntExpression(i)));134 }135 }136 if (byRefArguments.Count > 0)137 {138 invokeMethodOnTarget.CodeBuilder.AddStatement(new TryStatement());139 }140 var methodOnTargetInvocationExpression = GetCallbackMethodInvocation(invocation, args, callbackMethod, targetField, invokeMethodOnTarget);141 LocalReference returnValue = null;142 if (callbackMethod.ReturnType != typeof(void))143 {144 var returnType = invocation.GetClosedParameterType(callbackMethod.ReturnType);145 returnValue = invokeMethodOnTarget.CodeBuilder.DeclareLocal(returnType);146 invokeMethodOnTarget.CodeBuilder.AddStatement(new AssignStatement(returnValue, methodOnTargetInvocationExpression));147 }148 else149 {150 invokeMethodOnTarget.CodeBuilder.AddStatement(new ExpressionStatement(methodOnTargetInvocationExpression));151 }152 AssignBackByRefArguments(invokeMethodOnTarget, byRefArguments);153 if (callbackMethod.ReturnType != typeof(void))154 {155 var setRetVal =156 new MethodInvocationExpression(SelfReference.Self,157 InvocationMethods.SetReturnValue,158 new ConvertExpression(typeof(object), returnValue.Type, returnValue.ToExpression()));159 invokeMethodOnTarget.CodeBuilder.AddStatement(new ExpressionStatement(setRetVal));160 }161 invokeMethodOnTarget.CodeBuilder.AddStatement(new ReturnStatement());162 }163 private void AssignBackByRefArguments(MethodEmitter invokeMethodOnTarget, Dictionary<int, LocalReference> byRefArguments)164 {165 if (byRefArguments.Count == 0)166 {167 return;168 }169 invokeMethodOnTarget.CodeBuilder.AddStatement(new FinallyStatement());170 foreach (var byRefArgument in byRefArguments)171 {172 var index = byRefArgument.Key;173 var localReference = byRefArgument.Value;174 invokeMethodOnTarget.CodeBuilder.AddStatement(175 new ExpressionStatement(176 new MethodInvocationExpression(177 SelfReference.Self,178 InvocationMethods.SetArgumentValue,179 new LiteralIntExpression(index),180 new ConvertExpression(181 typeof(object),182 localReference.Type,183 new ReferenceExpression(localReference)))184 ));185 }186 invokeMethodOnTarget.CodeBuilder.AddStatement(new EndExceptionBlockStatement());187 }188 private void CreateConstructor(AbstractTypeEmitter invocation, ProxyGenerationOptions options)189 {190 ConstructorInfo baseConstructor;191 var baseCtorArguments = GetBaseCtorArguments(targetType, options, out baseConstructor);192 var constructor = CreateConstructor(invocation, baseCtorArguments);193 constructor.CodeBuilder.InvokeBaseConstructor(baseConstructor, baseCtorArguments);194 constructor.CodeBuilder.AddStatement(new ReturnStatement());195 }196 private ConstructorEmitter CreateConstructor(AbstractTypeEmitter invocation, ArgumentReference[] baseCtorArguments)197 {198 if (contributor == null)199 {200 return invocation.CreateConstructor(baseCtorArguments);201 }202 return contributor.CreateConstructor(baseCtorArguments, invocation);203 }204 private AbstractCodeBuilder EmitCallEnsureValidTarget(MethodEmitter invokeMethodOnTarget)205 {206 return invokeMethodOnTarget.CodeBuilder.AddStatement(207 new ExpressionStatement(208 new MethodInvocationExpression(SelfReference.Self, InvocationMethods.EnsureValidTarget)));209 }210 private void EmitCallThrowOnNoTarget(MethodEmitter invokeMethodOnTarget)211 {212 var throwOnNoTarget = new ExpressionStatement(new MethodInvocationExpression(InvocationMethods.ThrowOnNoTarget));213 invokeMethodOnTarget.CodeBuilder.AddStatement(throwOnNoTarget);214 invokeMethodOnTarget.CodeBuilder.AddStatement(new ReturnStatement());215 }216 private MethodInfo GetCallbackMethod(AbstractTypeEmitter invocation)217 {218 if (contributor != null)219 {220 return contributor.GetCallbackMethod();221 }222 var callbackMethod = callback;223 if (callbackMethod == null)224 {225 return null;226 }227 if (!callbackMethod.IsGenericMethod)228 {229 return callbackMethod;230 }231 return callbackMethod.MakeGenericMethod(invocation.GetGenericArgumentsFor(callbackMethod));232 }233 private AbstractTypeEmitter GetEmitter(ClassEmitter @class, Type[] interfaces, INamingScope namingScope,234 MethodInfo methodInfo)235 {236 var suggestedName = string.Format("Castle.Proxies.Invocations.{0}_{1}", methodInfo.DeclaringType.Name,237 methodInfo.Name);238 var uniqueName = namingScope.ParentScope.GetUniqueName(suggestedName);239 return new ClassEmitter(@class.ModuleScope, uniqueName, GetBaseType(), interfaces, ClassEmitter.DefaultAttributes, forceUnsigned: @class.InStrongNamedModule == false);240 }241 private void ImplemementInvokeMethodOnTarget(AbstractTypeEmitter invocation, ParameterInfo[] parameters,242 FieldReference targetField, MethodInfo callbackMethod)243 {244 var invokeMethodOnTarget = invocation.CreateMethod("InvokeMethodOnTarget", typeof(void));245 ImplementInvokeMethodOnTarget(invocation, parameters, invokeMethodOnTarget, targetField);246 }247 private void ImplementChangeInvocationTarget(AbstractTypeEmitter invocation, FieldReference targetField)248 {249 var changeInvocationTarget = invocation.CreateMethod("ChangeInvocationTarget", typeof(void), new[] { typeof(object) });250 changeInvocationTarget.CodeBuilder.AddStatement(251 new AssignStatement(targetField,252 new ConvertExpression(targetType, changeInvocationTarget.Arguments[0].ToExpression())));253 changeInvocationTarget.CodeBuilder.AddStatement(new ReturnStatement());254 }255 private void ImplementChangeProxyTarget(AbstractTypeEmitter invocation, ClassEmitter @class)256 {257 var changeProxyTarget = invocation.CreateMethod("ChangeProxyTarget", typeof(void), new[] { typeof(object) });258 var proxyObject = new FieldReference(InvocationMethods.ProxyObject);259 var localProxy = changeProxyTarget.CodeBuilder.DeclareLocal(typeof(IProxyTargetAccessor));260 changeProxyTarget.CodeBuilder.AddStatement(261 new AssignStatement(localProxy,262 new ConvertExpression(localProxy.Type, proxyObject.ToExpression())));263 var dynSetProxy = typeof(IProxyTargetAccessor).GetMethod(nameof(IProxyTargetAccessor.DynProxySetTarget));264 changeProxyTarget.CodeBuilder.AddStatement(265 new ExpressionStatement(266 new MethodInvocationExpression(localProxy, dynSetProxy, changeProxyTarget.Arguments[0].ToExpression())267 {268 VirtualCall = true269 }));270 changeProxyTarget.CodeBuilder.AddStatement(new ReturnStatement());271 }272 private void ImplementChangeProxyTargetInterface(ClassEmitter @class, AbstractTypeEmitter invocation,273 FieldReference targetField)274 {275 ImplementChangeInvocationTarget(invocation, targetField);276 ImplementChangeProxyTarget(invocation, @class);277 }278 }279}...
MethodWithInvocationGenerator.cs
Source:MethodWithInvocationGenerator.cs
...15{16 using System;17 using System.Diagnostics;18 using System.Reflection;19 using System.Reflection.Emit;20#if FEATURE_SERIALIZATION21 using System.Xml.Serialization;22#endif23 using Telerik.JustMock.Core.Castle.Core.Internal;24 using Telerik.JustMock.Core.Castle.DynamicProxy.Contributors;25 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;26 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;27 using Telerik.JustMock.Core.Castle.DynamicProxy.Internal;28 using Telerik.JustMock.Core.Castle.DynamicProxy.Tokens;29 internal class MethodWithInvocationGenerator : MethodGenerator30 {31 private readonly IInvocationCreationContributor contributor;32 private readonly GetTargetExpressionDelegate getTargetExpression;33 private readonly GetTargetExpressionDelegate getTargetTypeExpression;34 private readonly Reference interceptors;35 private readonly Type invocation;36 public MethodWithInvocationGenerator(MetaMethod method, Reference interceptors, Type invocation,37 GetTargetExpressionDelegate getTargetExpression,38 OverrideMethodDelegate createMethod, IInvocationCreationContributor contributor)39 : this(method, interceptors, invocation, getTargetExpression, null, createMethod, contributor)40 {41 }42 public MethodWithInvocationGenerator(MetaMethod method, Reference interceptors, Type invocation,43 GetTargetExpressionDelegate getTargetExpression,44 GetTargetExpressionDelegate getTargetTypeExpression,45 OverrideMethodDelegate createMethod, IInvocationCreationContributor contributor)46 : base(method, createMethod)47 {48 this.invocation = invocation;49 this.getTargetExpression = getTargetExpression;50 this.getTargetTypeExpression = getTargetTypeExpression;51 this.interceptors = interceptors;52 this.contributor = contributor;53 }54 protected FieldReference BuildMethodInterceptorsField(ClassEmitter @class, MethodInfo method, INamingScope namingScope)55 {56 var methodInterceptors = @class.CreateField(57 namingScope.GetUniqueName(string.Format("interceptors_{0}", method.Name)),58 typeof(IInterceptor[]),59 false);60#if FEATURE_SERIALIZATION61 @class.DefineCustomAttributeFor<XmlIgnoreAttribute>(methodInterceptors);62#endif63 return methodInterceptors;64 }65 protected override MethodEmitter BuildProxiedMethodBody(MethodEmitter emitter, ClassEmitter @class, ProxyGenerationOptions options, INamingScope namingScope)66 {67 var invocationType = invocation;68 Trace.Assert(MethodToOverride.IsGenericMethod == invocationType.GetTypeInfo().IsGenericTypeDefinition);69 var genericArguments = Type.EmptyTypes;70 var constructor = invocation.GetConstructors()[0];71 Expression proxiedMethodTokenExpression;72 if (MethodToOverride.IsGenericMethod)73 {74 // bind generic method arguments to invocation's type arguments75 genericArguments = emitter.MethodBuilder.GetGenericArguments();76 invocationType = invocationType.MakeGenericType(genericArguments);77 constructor = TypeBuilder.GetConstructor(invocationType, constructor);78 // Not in the cache: generic method79 proxiedMethodTokenExpression = new MethodTokenExpression(MethodToOverride.MakeGenericMethod(genericArguments));80 }81 else82 {83 var proxiedMethodToken = @class.CreateStaticField(namingScope.GetUniqueName("token_" + MethodToOverride.Name), typeof(MethodInfo));84 @class.ClassConstructor.CodeBuilder.AddStatement(new AssignStatement(proxiedMethodToken, new MethodTokenExpression(MethodToOverride)));85 proxiedMethodTokenExpression = proxiedMethodToken.ToExpression();86 }87 var methodInterceptors = SetMethodInterceptors(@class, namingScope, emitter, proxiedMethodTokenExpression);88 var dereferencedArguments = IndirectReference.WrapIfByRef(emitter.Arguments);89 var hasByRefArguments = HasByRefArguments(emitter.Arguments);90 var arguments = GetCtorArguments(@class, proxiedMethodTokenExpression, dereferencedArguments, methodInterceptors);91 var ctorArguments = ModifyArguments(@class, arguments);92 var invocationLocal = emitter.CodeBuilder.DeclareLocal(invocationType);93 emitter.CodeBuilder.AddStatement(new AssignStatement(invocationLocal,94 new NewInstanceExpression(constructor, ctorArguments)));95 if (MethodToOverride.ContainsGenericParameters)96 {97 EmitLoadGenricMethodArguments(emitter, MethodToOverride.MakeGenericMethod(genericArguments), invocationLocal);98 }99 if (hasByRefArguments)100 {101 emitter.CodeBuilder.AddStatement(new TryStatement());102 }103 var proceed = new ExpressionStatement(new MethodInvocationExpression(invocationLocal, InvocationMethods.Proceed));104 emitter.CodeBuilder.AddStatement(proceed);105 if (hasByRefArguments)106 {107 emitter.CodeBuilder.AddStatement(new FinallyStatement());108 }109 GeneratorUtil.CopyOutAndRefParameters(dereferencedArguments, invocationLocal, MethodToOverride, emitter);110 if (hasByRefArguments)111 {112 emitter.CodeBuilder.AddStatement(new EndExceptionBlockStatement());113 }114 if (MethodToOverride.ReturnType != typeof(void))115 {116 var getRetVal = new MethodInvocationExpression(invocationLocal, InvocationMethods.GetReturnValue);117 // Emit code to ensure a value type return type is not null, otherwise the cast will cause a null-deref118 if (emitter.ReturnType.GetTypeInfo().IsValueType && !emitter.ReturnType.IsNullableType())119 {120 LocalReference returnValue = emitter.CodeBuilder.DeclareLocal(typeof(object));121 emitter.CodeBuilder.AddStatement(new AssignStatement(returnValue, getRetVal));122 emitter.CodeBuilder.AddExpression(new IfNullExpression(returnValue, new ThrowStatement(typeof(InvalidOperationException),123 "Interceptors failed to set a return value, or swallowed the exception thrown by the target")));124 }125 // Emit code to return with cast from ReturnValue126 emitter.CodeBuilder.AddStatement(new ReturnStatement(new ConvertExpression(emitter.ReturnType, getRetVal)));127 }128 else129 {130 emitter.CodeBuilder.AddStatement(new ReturnStatement());131 }132 return emitter;133 }134 private Expression SetMethodInterceptors(ClassEmitter @class, INamingScope namingScope, MethodEmitter emitter, Expression proxiedMethodTokenExpression)135 {136 var selector = @class.GetField("__selector");137 if(selector == null)138 {139 return null;140 }141 var methodInterceptorsField = BuildMethodInterceptorsField(@class, MethodToOverride, namingScope);142 Expression targetTypeExpression;143 if (getTargetTypeExpression != null)144 {145 targetTypeExpression = getTargetTypeExpression(@class, MethodToOverride);146 }147 else148 {149 targetTypeExpression = new MethodInvocationExpression(null, TypeUtilMethods.GetTypeOrNull, getTargetExpression(@class, MethodToOverride));150 }151 var emptyInterceptors = new NewArrayExpression(0, typeof(IInterceptor));152 var selectInterceptors = new MethodInvocationExpression(selector, InterceptorSelectorMethods.SelectInterceptors,153 targetTypeExpression,154 proxiedMethodTokenExpression, interceptors.ToExpression())155 { VirtualCall = true };156 emitter.CodeBuilder.AddExpression(157 new IfNullExpression(methodInterceptorsField,158 new AssignStatement(methodInterceptorsField,159 new NullCoalescingOperatorExpression(selectInterceptors, emptyInterceptors))));160 return methodInterceptorsField.ToExpression();161 }162 private void EmitLoadGenricMethodArguments(MethodEmitter methodEmitter, MethodInfo method, Reference invocationLocal)163 {164 var genericParameters = method.GetGenericArguments().FindAll(t => t.GetTypeInfo().IsGenericParameter);165 var genericParamsArrayLocal = methodEmitter.CodeBuilder.DeclareLocal(typeof(Type[]));166 methodEmitter.CodeBuilder.AddStatement(167 new AssignStatement(genericParamsArrayLocal, new NewArrayExpression(genericParameters.Length, typeof(Type))));168 for (var i = 0; i < genericParameters.Length; ++i)169 {170 methodEmitter.CodeBuilder.AddStatement(171 new AssignArrayStatement(genericParamsArrayLocal, i, new TypeTokenExpression(genericParameters[i])));172 }173 methodEmitter.CodeBuilder.AddExpression(174 new MethodInvocationExpression(invocationLocal,175 InvocationMethods.SetGenericMethodArguments,176 new ReferenceExpression(177 genericParamsArrayLocal)));178 }179 private Expression[] GetCtorArguments(ClassEmitter @class, Expression proxiedMethodTokenExpression, TypeReference[] dereferencedArguments, Expression methodInterceptors)180 {181 return new[]182 {183 getTargetExpression(@class, MethodToOverride),184 SelfReference.Self.ToExpression(),185 methodInterceptors ?? interceptors.ToExpression(),186 proxiedMethodTokenExpression,187 new ReferencesToObjectArrayExpression(dereferencedArguments)188 };189 }190 private Expression[] ModifyArguments(ClassEmitter @class, Expression[] arguments)191 {192 if (contributor == null)193 {194 return arguments;195 }196 return contributor.GetConstructorInvocationArguments(arguments, @class);197 }198 private bool HasByRefArguments(ArgumentReference[] arguments)199 {200 for (int i = 0; i < arguments.Length; i++ )201 {202 if (arguments[i].Type.GetTypeInfo().IsByRef)203 {204 return true;...
ClassProxyInstanceContributor.cs
Source:ClassProxyInstanceContributor.cs
...18 using System.Reflection;19#if FEATURE_SERIALIZATION20 using System.Runtime.Serialization;21#endif22 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;23 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.CodeBuilders;24 using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;25 using Telerik.JustMock.Core.Castle.DynamicProxy.Internal;26 using Telerik.JustMock.Core.Castle.DynamicProxy.Tokens;27 internal class ClassProxyInstanceContributor : ProxyInstanceContributor28 {29#if FEATURE_SERIALIZATION30 private readonly bool delegateToBaseGetObjectData;31 private readonly bool implementISerializable;32 private ConstructorInfo serializationConstructor;33 private readonly IList<FieldReference> serializedFields = new List<FieldReference>();34#endif35 public ClassProxyInstanceContributor(Type targetType, IList<MethodInfo> methodsToSkip, Type[] interfaces,36 string typeId)37 : base(targetType, interfaces, typeId)38 {39#if FEATURE_SERIALIZATION40 if (targetType.IsSerializable)41 {42 implementISerializable = true;43 delegateToBaseGetObjectData = VerifyIfBaseImplementsGetObjectData(targetType, methodsToSkip);44 }45#endif46 }47 protected override Reference GetTargetReference(ClassEmitter emitter)48 {49 return SelfReference.Self;50 }51 public override void Generate(ClassEmitter @class, ProxyGenerationOptions options)52 {53 var interceptors = @class.GetField("__interceptors");54#if FEATURE_SERIALIZATION55 if (implementISerializable)56 {57 ImplementGetObjectData(@class);58 Constructor(@class);59 }60#endif61 ImplementProxyTargetAccessor(@class, interceptors);62 foreach (var attribute in targetType.GetTypeInfo().GetNonInheritableAttributes())63 {64 @class.DefineCustomAttribute(attribute.Builder);65 }66 }67#if FEATURE_SERIALIZATION68 protected override void AddAddValueInvocation(ArgumentReference serializationInfo, MethodEmitter getObjectData,69 FieldReference field)70 {71 serializedFields.Add(field);72 base.AddAddValueInvocation(serializationInfo, getObjectData, field);73 }74 protected override void CustomizeGetObjectData(AbstractCodeBuilder codebuilder, ArgumentReference serializationInfo,75 ArgumentReference streamingContext, ClassEmitter emitter)76 {77 codebuilder.AddStatement(new ExpressionStatement(78 new MethodInvocationExpression(79 serializationInfo,80 SerializationInfoMethods.AddValue_Bool,81 new ConstReference("__delegateToBase").ToExpression(),82 new ConstReference(delegateToBaseGetObjectData).83 ToExpression())));84 if (delegateToBaseGetObjectData == false)85 {86 EmitCustomGetObjectData(codebuilder, serializationInfo);87 return;88 }89 EmitCallToBaseGetObjectData(codebuilder, serializationInfo, streamingContext);90 }91 private void EmitCustomGetObjectData(AbstractCodeBuilder codebuilder, ArgumentReference serializationInfo)92 {93 var members = codebuilder.DeclareLocal(typeof(MemberInfo[]));94 var data = codebuilder.DeclareLocal(typeof(object[]));95 var getSerializableMembers = new MethodInvocationExpression(96 null,97 FormatterServicesMethods.GetSerializableMembers,98 new TypeTokenExpression(targetType));99 codebuilder.AddStatement(new AssignStatement(members, getSerializableMembers));100 // Sort to keep order on both serialize and deserialize side the same, c.f DYNPROXY-ISSUE-127101 var callSort = new MethodInvocationExpression(102 null,103 TypeUtilMethods.Sort,104 members.ToExpression());105 codebuilder.AddStatement(new AssignStatement(members, callSort));106 var getObjectData = new MethodInvocationExpression(107 null,108 FormatterServicesMethods.GetObjectData,109 SelfReference.Self.ToExpression(),110 members.ToExpression());111 codebuilder.AddStatement(new AssignStatement(data, getObjectData));112 var addValue = new MethodInvocationExpression(113 serializationInfo,114 SerializationInfoMethods.AddValue_Object,115 new ConstReference("__data").ToExpression(),116 data.ToExpression());117 codebuilder.AddStatement(new ExpressionStatement(addValue));118 }119 private void EmitCallToBaseGetObjectData(AbstractCodeBuilder codebuilder, ArgumentReference serializationInfo,120 ArgumentReference streamingContext)121 {122 var baseGetObjectData = targetType.GetMethod("GetObjectData",123 new[] { typeof(SerializationInfo), typeof(StreamingContext) });124 codebuilder.AddStatement(new ExpressionStatement(125 new MethodInvocationExpression(baseGetObjectData,126 serializationInfo.ToExpression(),127 streamingContext.ToExpression())));128 }129 private void Constructor(ClassEmitter emitter)130 {131 if (!delegateToBaseGetObjectData)132 {133 return;134 }135 GenerateSerializationConstructor(emitter);136 }137 private void GenerateSerializationConstructor(ClassEmitter emitter)138 {139 var serializationInfo = new ArgumentReference(typeof(SerializationInfo));140 var streamingContext = new ArgumentReference(typeof(StreamingContext));141 var ctor = emitter.CreateConstructor(serializationInfo, streamingContext);142 ctor.CodeBuilder.AddStatement(143 new ConstructorInvocationStatement(serializationConstructor,144 serializationInfo.ToExpression(),145 streamingContext.ToExpression()));146 foreach (var field in serializedFields)147 {148 var getValue = new MethodInvocationExpression(serializationInfo,149 SerializationInfoMethods.GetValue,150 new ConstReference(field.Reference.Name).ToExpression(),151 new TypeTokenExpression(field.Reference.FieldType));...
Emit
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;6using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;7using Telerik.JustMock.Core.Castle.DynamicProxy.Generators;8using Telerik.JustMock.Core.Castle.DynamicProxy;9{10 {11 static void Main(string[] args)12 {13 var emitter = new ClassEmitter(new ModuleScope(), "MyClass", typeof(object), Type.EmptyTypes, TypeAttributes.Public);14 var method = emitter.CreateMethod("MyMethod", MethodAttributes.Public, typeof(string), Type.EmptyTypes);15 var il = method.GetILGenerator();16 var conv = new ConvertExpression(typeof(string), typeof(int), new LoadLocalExpression(typeof(int)));17 conv.Emit(il);18 }19 }20}21using System;22using System.Collections.Generic;23using System.Linq;24using System.Text;25using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;26using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;27using Telerik.JustMock.Core.Castle.DynamicProxy.Generators;28using Telerik.JustMock.Core.Castle.DynamicProxy;29{30 {31 static void Main(string[] args)32 {33 var emitter = new ClassEmitter(new ModuleScope(), "MyClass", typeof(object), Type.EmptyTypes, TypeAttributes.Public);34 var method = emitter.CreateMethod("MyMethod", MethodAttributes.Public, typeof(string), Type.EmptyTypes);35 var il = method.GetILGenerator();36 var conv = new LoadLocalExpression(typeof(int));37 conv.Emit(il);38 }39 }40}
Emit
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;7using Telerik.JustMock.Core.Castle.DynamicProxy.Generators;8using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;9using Telerik.JustMock.Core.Castle.DynamicProxy;10using Telerik.JustMock.Core.Castle.Core.Internal;11using Telerik.JustMock.Core.Castle.Core;12using System.Reflection.Emit;13using System.Reflection;14using System.Runtime.InteropServices;15using System.Security;16{17 {18 static void Main(string[] args)19 {20 var moduleScope = new ModuleScope(true);21 var emitter = new ClassEmitter(moduleScope, "Test", typeof(object), Type.EmptyTypes, TypeAttributes.Public | TypeAttributes.Sealed);22 var method = emitter.CreateMethod("Test", MethodAttributes.Public, typeof(void), Type.EmptyTypes);23 var il = method.GetILGenerator();24 var convertExpression = new ConvertExpression(typeof(int), new ConstReference(5));25 convertExpression.Emit(il);26 il.Emit(OpCodes.Ret);27 var type = emitter.BuildType();28 type.GetMethod("Test").Invoke(null, null);29 }30 }31}
Emit
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;7{8 {9 static void Main(string[] args)10 {11 var convertExpression = new ConvertExpression(typeof(int), new LoadReferenceExpression(typeof(int)));12 convertExpression.Emit(null, null);13 }14 }15}
Emit
Using AI Code Generation
1using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;2using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;3using System;4using System.Reflection.Emit;5{6public static void Main()7{8ConvertExpression convert = new ConvertExpression(typeof(int), new ReferenceExpression(typeof(string)));9convert.Emit(new ILGenerator());10}11}12using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters;13using Telerik.JustMock.Core.Castle.DynamicProxy.Generators.Emitters.SimpleAST;14using System;15using System.Reflection.Emit;16{17public static void Main()18{19Expression expression = new ConvertExpression(typeof(int), new ReferenceExpression(typeof(string)));20expression.Emit(new ILGenerator());21}22}
Emit
Using AI Code Generation
1var value = 1;2var expression = new ConvertExpression(typeof(object), new LoadExpression(value));3var method = new MethodEmitter(null, "Method", typeof(void), Type.EmptyTypes);4expression.Emit(method.GetILGenerator());5method.FinishEmitting();6var value = "1";7var expression = new ConvertExpression(typeof(int), new LoadExpression(value));8var method = new MethodEmitter(null, "Method", typeof(void), Type.EmptyTypes);9expression.Emit(method.GetILGenerator());10method.FinishEmitting();11var value = 1;12var expression = new ConvertExpression(typeof(long), new LoadExpression(value));13var method = new MethodEmitter(null, "Method", typeof(void), Type.EmptyTypes);14expression.Emit(method.GetILGenerator());15method.FinishEmitting();16var value = "1";17var expression = new ConvertExpression(typeof(object), new LoadExpression(value));18var method = new MethodEmitter(null, "Method", typeof(void), Type.EmptyTypes);19expression.Emit(method.GetILGenerator());20method.FinishEmitting();21var value = 1;22var expression = new ConvertExpression(typeof(object), new LoadExpression(value));23var method = new MethodEmitter(null, "Method", typeof(void), Type.EmptyTypes);
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!