public void InvokeUsingSingleIntParameter() { object sample = new Sample <int>(); var invoker = new DynamicInvoker(sample.GetType()); invoker.Invoke(sample, "ReturnHashCode", 35) .Should().Be(35.GetHashCode()); }
public void CannotInvokeGenericMethod() { var expected = 42.GetHashCode() + "qwe".GetHashCode(); object sample = new Sample <int>(); var invoker = new DynamicInvoker(sample.GetType()); invoker.Executing(x => x.Invoke(sample, "ReturnHashCode", "qwe", 42)).Throws <MissingMethodException>(); }
public void InvokeUsingTwoParametersAndOverloadedMethodsPassingNullToSecondParameter() { var expected = 35.GetHashCode(); object sample = new Sample <int>(); var invoker = new DynamicInvoker(sample.GetType()); invoker.Invoke(sample, "ReturnHashCode", 35, null) .Should().Be(expected); }
public UIThreadInvoker() { _mainThreadId = Thread.CurrentThread.ManagedThreadId; var type = DynamicInvoker.GetType("System.Windows.Forms", "Control"); var control = Activator.CreateInstance(type); DynamicInvoker.InvokeMethod(control, "CreateControl"); invokeMethod = new MethodInvoker(control, "Invoke", new Type[] { typeof(Delegate) }); beginInvokeMethod = new MethodInvoker(control, "BeginInvoke", new Type[] { typeof(Delegate) }); }
/// <summary> /// 注册方法 /// </summary> /// <param name="functionKey">方法标识</param> /// <param name="serviceKey">服务标识</param> /// <param name="serviceName">名称</param> /// <param name="description">描述信息</param> /// <param name="offline">离线标志</param> /// <param name="methodInfo">方法信息对象</param> /// <param name="dataUpdateEvent">数据更新事件签名</param> private void RegisterFunction(string functionKey, string serviceKey, string serviceName, string description, bool offline, MethodInfo methodInfo, string dataUpdateEvent) { if (!subsystems.ContainsKey(serviceKey)) { throw new ArgumentException("在注册[" + serviceName + "]服务时发现SystemManager并不已经存在Key为[" + serviceKey + "]的子系统信息", "subsystemKey"); } ServiceInfo subsystem = subsystems[serviceKey]; subsystem.AddService(new RemoteMethodInfo(functionKey, serviceKey, serviceName, description, offline, methodInfo, dataUpdateEvent)); invokers.Add(methodInfo, DynamicInvoker.GetMethodInvoker(methodInfo)); }
public void InvokeMethodWithOutParameterAndReferenceType() { object sample = new Sample <string>(); object[] args = new[] { null, "asd" }; var invoker = new DynamicInvoker(sample.GetType()); invoker.Invoke(sample, "SetValue", args).Should().Be(null); args.Should().Have.SameSequenceAs("asd", "asd"); }
/// <summary> /// Add target to calltable /// </summary> /// <param name="target"></param> private void AddToCallTable(object target) { var versions = target.GetType().GetCustomAttributes <VersionAttribute>(true) .Select(v => "_v" + v.Value) .ToList(); if (versions.Count == 0) { versions.Add(string.Empty); } foreach (var methodInfo in target.GetType().GetMethods()) { if (!typeof(Task).IsAssignableFrom(methodInfo.ReturnType)) { // must be assignable from task continue; } var tArgs = methodInfo.ReturnParameter.ParameterType .GetGenericArguments(); if (tArgs.Length > 1) { // must have exactly 0 or one (serializable) type to return continue; } var name = methodInfo.Name; if (name.EndsWith("Async", StringComparison.Ordinal)) { name = name.Substring(0, name.Length - 5); } name = name.ToLowerInvariant(); // Register for all defined versions foreach (var version in versions) { var versionedName = name + version; versionedName = versionedName.ToLowerInvariant(); if (!_calltable.TryGetValue(versionedName, out var invoker)) { invoker = new DynamicInvoker(_logger); _calltable.Add(versionedName, invoker); } if (invoker is DynamicInvoker dynamicInvoker) { dynamicInvoker.Add(target, methodInfo); } else { // Should never happen... throw new InvalidOperationException( $"Cannot add {versionedName} since invoker is private."); } } } }
public void NullOrWhitespaceParametersTest() { var generator = new Generator(); var dynamicInvoker = new DynamicInvoker( generator ); EmptyAndNullParametersTestHelper( dynamicInvoker, "" ); EmptyAndNullParametersTestHelper( dynamicInvoker, null ); EmptyAndNullParametersTestHelper( dynamicInvoker, " " ); EmptyAndNullParametersTestHelper( dynamicInvoker, "\r\n" ); EmptyAndNullParametersTestHelper( dynamicInvoker, "\t\t\t" ); }
private static void EmptyAndNullParametersTestHelper( DynamicInvoker dynamicInvoker, string parameters ) { var callStatement = new CallStatement( Helper.EmptyPosition, "Name", parameters ); var invokeCodeWriter = dynamicInvoker.Invoke<CodeWriter>( "GenerateInvoke", callStatement ); Assert.IsNotNull( invokeCodeWriter ); var invokeText = invokeCodeWriter.ToString().Replace( " ", "" ); Assert.That( invokeText, Is.EqualTo( "this.Invoke(\"Name\")" ) ); }
private static unsafe void TypedPointerFieldTest(DynamicInvoker reader, DynamicInvoker writer) { var obj = new MyClass() { TypedPointerField = (byte *)new IntPtr(42) }; Equal(new IntPtr(42), new IntPtr(Pointer.Unbox(reader(obj)))); Null(writer(obj, Pointer.Box(new IntPtr(56).ToPointer(), typeof(byte *)))); Equal(new IntPtr(56), new IntPtr(Pointer.Unbox(reader(obj)))); }
public void InvokeVoidMethodRespectsCounterEffects() { object sample = new Sample <string>(); var invoker = new DynamicInvoker(sample.GetType()); invoker.Invoke(sample, "SetFlag", "true") .Should().Be(null); sample.Should().Be.OfType <Sample <string> >() .And.Value.Flag.Should().Be("true"); }
public AppCrash() { var applicationType = DynamicInvoker.GetType("System.Windows.Forms", "Application"); if (applicationType != null) { DynamicInvoker.AddEventHandler <ThreadExceptionEventHandler>(applicationType, "ThreadException", Application_ThreadException); } AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; ProductName = DynamicInvoker.GetPropertyValue(applicationType, "ProductName") as string; DeveloperMail = "*****@*****.**"; CrashDir = "CrashLogs"; }
public void SimpleTest() { var generator = new Generator(); var dynamicInvoker = new DynamicInvoker( generator ); var callStatement = new CallStatement( Helper.EmptyPosition, "Name", "param1, param2" ); var invokeCodeWriter = dynamicInvoker.Invoke<CodeWriter>( "GenerateInvoke", callStatement ); Assert.IsNotNull( invokeCodeWriter ); var invokeText = invokeCodeWriter.ToString().Replace( " ", "" ); Assert.That( invokeText, Is.EqualTo( "this.Invoke(\"Name\",param1,param2)" ) ); }
public void MatchMethodTest() { var testGenerator = new TestGenerator(); var invoker = new DynamicInvoker( testGenerator ); var typeProperty = new TypeProperty { Name = "TypeProperty1", Type = typeof(int) }; var navigationProperty1 = new NavigationProperty { Name = "Property1", Property = typeProperty, IsCollection = true }; var navigationProperty2 = new NavigationProperty { Name = "Property2", Property = typeProperty, IsCollection = false }; invoker.Invoke<object>( "DefineProperty", navigationProperty1 ); invoker.Invoke<object>( "DefineProperty", navigationProperty2 ); Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 0 ) ); Assert.That( testGenerator.NavigationDefinePropertyCalls, Is.EqualTo( 2 ) ); Assert.That( testGenerator.NavigationListDefinePropertyCalls, Is.EqualTo( 1 ) ); Assert.That( testGenerator.NavigationNotListDefinePropertyCalls, Is.EqualTo( 1 ) ); }
public void SimpleInvokeTest() { var testGenerator = new TestGenerator(); var invoker = new DynamicInvoker( testGenerator ); var typeProperty = new TypeProperty { Name = "Property1", Type = typeof(int) }; invoker.Invoke<object>( "DefineProperty", typeProperty ); Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 1 ) ); Assert.That( testGenerator.NavigationDefinePropertyCalls, Is.EqualTo( 0 ) ); testGenerator.TypeDefinePropertyCalls = 0; var navigationProperty = new ComplexProperty { Name = "Property2", Type = typeof(string) }; invoker.Invoke<object>( "DefineProperty", navigationProperty ); Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 0 ) ); Assert.That( testGenerator.ComplexDefinePropertyCalls, Is.EqualTo( 1 ) ); }
/// <summary> /// 获取方法的动态调用器 /// </summary> /// <param name="method">The method.</param> /// <returns></returns> public DynamicInvokerHandler GetDynamicInvoker(MethodInfo method) { if (invokers.ContainsKey(method)) { return(invokers[method]); } else { try { logger.Debug(String.Format("生成方法 \"{0}\" 的调用器", method)); //if (method.IsGenericMethod) // method = method.GetGenericMethodDefinition(); DynamicInvokerHandler invoker = DynamicInvoker.GetMethodInvoker(method); invokers[method] = invoker; return(invoker); } catch (Exception ex) { throw ex; } } }
private void AdaptCollection(Type adapterType) { dynamic adapter; try { adapter = new DynamicInvoker(Activator.CreateInstance(adapterType)); } catch (MissingMemberException ex) { throw CollectionException.FailedAdapterActivation(adapterType, ex); } if (Collection != null) { //initialize adapter adapter.Collection = Collection; //replace collection with adapter Collection = adapter.InnerObject; } }
/// <summary> /// Invokes the delegate. /// </summary> /// <param name="invoker">The delegate to invoke.</param> /// <param name="target">Target object; for static members should be <see langword="null"/>.</param> /// <returns>The result of member invocation.</returns> public static object?Invoke(this DynamicInvoker invoker, object?target) => invoker(target, Span <object?> .Empty);
/// <summary> /// Invokes the delegate. /// </summary> /// <param name="invoker">The delegate to invoke.</param> /// <param name="target">Target object; for static members should be <see langword="null"/>.</param> /// <param name="arg1">The first argument.</param> /// <param name="arg2">The second argument.</param> /// <param name="arg3">The third argument.</param> /// <param name="arg4">The fourth argument.</param> /// <returns>The result of member invocation.</returns> public static object?Invoke(this DynamicInvoker invoker, object?target, object?arg1, object?arg2, object?arg3, object?arg4) { var args = (arg1, arg2, arg3, arg4); return(invoker(target, Span.AsSpan(ref args))); }
private void InvokeMehtod(object target, MethodInfo method, EventArgs e) { DynamicInvokerHandler invoker = DynamicInvoker.GetMethodInvoker(method); invoker(target, new object[] { null, e }); }
protected GeneratorBase() { this.dynamicInvoker = new DynamicInvoker( this ); }
public static bool IsSupported() { var type = DynamicInvoker.GetType("System.Windows.Forms", "Control"); return(type != null); }
/// <summary> /// Invokes the delegate. /// </summary> /// <param name="invoker">The delegate to invoke.</param> /// <param name="target">Target object; for static members should be <see langword="null"/>.</param> /// <param name="arg">The first argument.</param> /// <returns>The result of member invocation.</returns> public static object?Invoke(this DynamicInvoker invoker, object?target, object?arg) => invoker(target, MemoryMarshal.CreateSpan(ref arg, 1));