public object GetRealObject(StreamingContext context) { var tInterfaces = Interfaces ?? MonoInterfaces.Select(it => Type.GetType(it)).ToArray(); var tType = BuildProxy.BuildType(Context, tInterfaces.First(), tInterfaces.Skip(1).ToArray()); return(Impromptu.InitializeProxy(tType, Original, tInterfaces)); }
public object GetRealObject(StreamingContext context) { var interfaces = Interfaces ?? MonoInterfaces.Select(it => Type.GetType(it)).ToArray(); var type = BuildProxy.BuildType(Context, interfaces.First(), interfaces.Skip(1).ToArray()); return(InvocationBinding.InitializeProxy(type, Original, interfaces)); }
internal static object InvokeConvertCallSite(object target, bool explict, Type type, Type context, ref CallSite callSite) { if (callSite == null) { LazyBinder binder = () => { var flags = explict ? CSharpBinderFlags.ConvertExplicit : CSharpBinderFlags.None; return(Binder.Convert(flags, type, context)); }; Type binderType = typeof(ConvertBinder); var func = BuildProxy.GenerateCallSiteFuncType(new Type[] {}, type); callSite = CreateCallSite(func, binderType, binder, explict ? Invocation.ExplicitConvertBinderName : Invocation.ImplicitConvertBinderName, context); } dynamic theDynamicCallSite = callSite; return(theDynamicCallSite.OriginalTarget(callSite, target)); }
/// <summary> /// Static Method that wraps an existing dynamic object with a explicit interface type /// </summary> /// <param name="originalDynamic">The original dynamic.</param> /// <param name="otherInterfaces">The other interfaces.</param> /// <returns></returns> public static dynamic DynamicActLike(object originalDynamic, params Type[] otherInterfaces) { Type tContext; bool tDummy; originalDynamic = originalDynamic.GetTargetContext(out tContext, out tDummy); tContext = tContext.FixContext(); var tProxy = BuildProxy.BuildType(tContext, otherInterfaces.First(), otherInterfaces.Skip(1).ToArray()); return(InitializeProxy(tProxy, originalDynamic, otherInterfaces)); }
public static dynamic DynamicDressedAs(object originalDynamic, params Type[] otherInterfaces) { Type tContext; bool tDummy; originalDynamic = originalDynamic.GetInvocationContext(out tContext, out tDummy); tContext = tContext.MaybeDetectArrayContext(); var tProxy = BuildProxy.BuildType(tContext, otherInterfaces.First(), otherInterfaces.Skip(1).ToArray()); return(InitializeProxy(tProxy, originalDynamic, otherInterfaces)); }
/// <summary> /// Makes static methods for the passed in property spec, designed to be used with old api's that reflect properties. /// </summary> /// <param name="originalDynamic"> The original dynamic. </param> /// <param name="propertySpec"> The property spec. </param> /// <returns> </returns> public static dynamic ActLikeProperties(this object originalDynamic, IDictionary <string, Type> propertySpec) { Type tContext; bool tDummy; originalDynamic = originalDynamic.GetTargetContext(out tContext, out tDummy); tContext = tContext.FixContext(); var tProxy = BuildProxy.BuildType(tContext, propertySpec); return (InitializeProxy(tProxy, originalDynamic, propertySpec: propertySpec)); }
public static dynamic SelectProperties(this object originalDynamic, IDictionary <string, Type> propertySpec) { Type context; bool _; originalDynamic = originalDynamic.GetInvocationContext(out context, out _); context = context.MaybeDetectArrayContext(); var tProxy = BuildProxy.BuildType(context, propertySpec); return (InitializeProxy(tProxy, originalDynamic, propertySpec: propertySpec)); }
public object GetRealObject(StreamingContext context) { var tInterfaces = Interfaces; if (tInterfaces == null) { throw new InvalidOperationException("Expected SerializationData to contain a non-null Interfaces field. Please consider upgrading mono!"); } var tType = BuildProxy.BuildType(Context, tInterfaces.First(), tInterfaces.Skip(1).ToArray()); return(Impromptu.InitializeProxy(tType, Original, tInterfaces)); }
/// <summary> /// Extension Method that Wraps an existing object with an Explicit interface definition /// </summary> /// <typeparam name="TInterface"> The type of the interface. </typeparam> /// <param name="originalDynamic"> The original object can be annoymous type, System.DynamicObject as well as any others. </param> /// <param name="otherInterfaces"> Optional other interfaces. </param> /// <returns> </returns> public static TInterface ActLike <TInterface>(this object originalDynamic, params Type[] otherInterfaces) where TInterface : class { Type tContext; bool tDummy; originalDynamic = originalDynamic.GetTargetContext(out tContext, out tDummy); tContext = tContext.FixContext(); var tProxy = BuildProxy.BuildType(tContext, typeof(TInterface), otherInterfaces); return ((TInterface) InitializeProxy(tProxy, originalDynamic, new[] { typeof(TInterface) }.Concat(otherInterfaces))); }
public static TInterface DressedAs <TInterface>(this object originalDynamic, params Type[] otherInterfaces) where TInterface : class { Type context; bool _; originalDynamic = originalDynamic.GetInvocationContext(out context, out _); context = context.MaybeDetectArrayContext(); var proxy = BuildProxy.BuildType(context, typeof(TInterface), otherInterfaces); return ((TInterface) InitializeProxy(proxy, originalDynamic, new[] { typeof(TInterface) }.Concat(otherInterfaces))); }
internal static void InvokeMemberAction(ref CallSite callsite, Type binderType, int knownType, LazyBinder binder, String_OR_InvokeMemberName name, bool staticContext, Type context, string[] argNames, object target, params object [] args) { var tSwitch = args.Length; switch (tSwitch) { #region Optimizations case 0: { var tCallSite = (CallSite <Action <CallSite, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target); break; } case 1: { var tCallSite = (CallSite <Action <CallSite, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0]); break; } case 2: { var tCallSite = (CallSite <Action <CallSite, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1]); break; } case 3: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2]); break; } case 4: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3]); break; } case 5: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4]); break; } case 6: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5]); break; } case 7: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); break; } case 8: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); break; } case 9: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); break; } case 10: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); break; } case 11: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10]); break; } case 12: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11]); break; } case 13: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12]); break; } case 14: { var tCallSite = (CallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Action <CallSite, object, object, object, object, object, object, object, object, object, object, object, object, object, object, object> >(binderType, knownType, binder, name, context, argNames, staticContext); callsite = tCallSite; } tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13]); break; } #endregion default: var tArgTypes = Enumerable.Repeat(typeof(object), tSwitch); var tDelagateType = BuildProxy.GenerateCallSiteFuncType(tArgTypes, typeof(void)); Impromptu.InvokeCallSite(CreateCallSite(tDelagateType, binderType, knownType, binder, name, context, argNames), target, args); break; } }
internal static TReturn InvokeMemberTargetType <TTarget, TReturn>( ref CallSite callsite, Type binderType, LazyBinder binder, String_OR_InvokeMemberName name, bool staticContext, Type context, string[] argNames, TTarget target, params object [] args) { var tSwitch = args.Length; switch (tSwitch) { case 0: { var tCallSite = (CallSite <Func <CallSite, TTarget, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target)); } case 1: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0])); } case 2: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1])); } case 3: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2])); } case 4: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3])); } case 5: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4])); } case 6: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5])); } case 7: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6])); } case 8: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7])); } case 9: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8])); } case 10: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9])); } case 11: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10])); } case 12: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11])); } case 13: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12])); } case 14: { var tCallSite = (CallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >)callsite; if (tCallSite == null) { tCallSite = CreateCallSite <Func <CallSite, TTarget, object, object, object, object, object, object, object, object, object, object, object, object, object, object, TReturn> >(binderType, binder, name, context, argNames, staticContext); callsite = tCallSite; } return(tCallSite.Target(tCallSite, target, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13])); } default: var tArgTypes = Enumerable.Repeat(typeof(object), tSwitch); var tDelagateType = BuildProxy.GenerateCallSiteFuncType(tArgTypes, typeof(TTarget)); return(Impromptu.InvokeCallSite(CreateCallSite(tDelagateType, binderType, binder, name, context, argNames), target, args)); } }
public void Setup() { Builder = BuildProxy.WriteOutDll("ImpromptuEmit"); }