public void GenerateDouble(ILGenerator generator, FunctionSet set, FunctionParams pars) { double val; if (HasConstantValue(set, pars, out val)) { generator.Emit(OpCodes.Ldc_R8, val); return; } // We must make sure all params are in double form! src1.GenerateDouble(generator, set, pars); src2.GenerateDouble(generator, set, pars); // We generate the call on those two params. PowDelegate pow = global::System.Math.Pow; generator.EmitCall(OpCodes.Call, pow.Method, null); }
// Main static void Main(string[] args) { // 1 var program = new Program(); var printer = new Printer(); BaseDelegate aa = Gav; BaseDelegate2 bb = Gav2; // 2 DelegateForStatic delegateForStatic = StaticMethod; delegateForStatic("Static method works"); // 3 Console.WriteLine(); BaseDelegate2 printerDelegate = printer.Print; printerDelegate.Invoke(new B()); // 4 var del = new Action <string>(str => Console.Write(str)); del("adsfdsfdsdfsdf"); del?.Invoke("adsfdsfdsdfsdf"); // 5 Console.WriteLine(); DelegateForChains d1 = ChainMethod2; DelegateForChains d2 = ChainMethod1; DelegateForChains d3 = ChainMethod1; d3 += d1; d3 += d2; d3 += d2; d3 -= d2; d3(); // 6 var dels = d3.GetInvocationList(); Console.WriteLine(); foreach (var d in dels) { if (nameof(ChainMethod1) == d.Method.Name) { d.DynamicInvoke(); } } // 7 Console.WriteLine(); Func <double, double, double> genDel = (a, b) => Math.Pow(a, b); Console.WriteLine(genDel(2, 3)); PowDelegate powDel = (a, b) => Math.Pow(a, b); Console.WriteLine(powDel(3, 2)); // 9 Console.WriteLine(); MyEvent += EventMethod; MyEvent(); }