public static void DynamicInvoke() { A a1 = new A(); A a2 = new A(); B b1 = new B(); B b2 = new B(); DynamicInvokeDelegate testDelegate = DynamicInvokeTestFunction; // Check that the delegate behaves as expected A refParam = b2; B outParam = null; A returnValue = testDelegate(a1, b1, ref refParam, out outParam); Assert.Same(returnValue, a1); Assert.Same(refParam, b1); Assert.Same(outParam, b2); // Check dynamic invoke behavior object[] parameters = new object[] { a1, b1, b2, null }; object retVal = testDelegate.DynamicInvoke(parameters); Assert.Same(retVal, a1); Assert.Same(parameters[2], b1); Assert.Same(parameters[3], b2); // Check invoke on a delegate that takes no parameters. Action emptyDelegate = EmptyFunc; emptyDelegate.DynamicInvoke(new object[] { }); emptyDelegate.DynamicInvoke(null); }
internal object Invoke(object sender, object[] args) { if (_delegate == null) { return(null); } return(_delegate.DynamicInvoke(sender, args)); }
public static void TestDynamicInvoke() { A a1 = new A(); A a2 = new A(); B b1 = new B(); B b2 = new B(); DynamicInvokeDelegate testDelegate = DynamicInvokeTestFunction; // Check that the delegate behaves as expected A refParam = b2; B outParam = null; A returnValue = testDelegate(a1, b1, ref refParam, out outParam); Assert.True(RuntimeHelpers.ReferenceEquals(returnValue, a1)); Assert.True(RuntimeHelpers.ReferenceEquals(refParam, b1)); Assert.True(RuntimeHelpers.ReferenceEquals(outParam, b2)); // Check dynamic invoke behavior object[] parameters = new object[4]; parameters[0] = a1; parameters[1] = b1; parameters[2] = b2; parameters[3] = null; object retVal = testDelegate.DynamicInvoke(parameters); Assert.True(RuntimeHelpers.ReferenceEquals(retVal, a1)); Assert.True(RuntimeHelpers.ReferenceEquals(parameters[2], b1)); Assert.True(RuntimeHelpers.ReferenceEquals(parameters[3], b2)); // Check invoke on a delegate that takes no parameters. Action emptyDelegate = EmptyFunc; emptyDelegate.DynamicInvoke(new object[] { }); emptyDelegate.DynamicInvoke(null); }