public void Run <T1, T2, T3>(C1 <T1, T2> x1, C1 <T1[], T2> x2, dynamic dyn, T3 t3) { // Viable callables: {C2,C3,C4,C5,C6,C7}.M() x1.M(default(T1), 8); // Viable callables: {C2,C3,C4,C5,C6,C7}.{get_Prop(),set_Prop()} x1.Prop = x1.Prop; // Viable callables: {C2,C3,C4,C5,C6,C7}.{get_Item(),set_Item()} x1[default(T2)] = x1[default(T2)]; // Viable callables: {C2,C3,C4,C5,C6,C7}.{add_Event(),remove_Event()} x1.Event += () => { }; x1.Event -= () => { }; // Viable callables: {C4,C6}.M() (not C7.M(), as C7<T[]> is not constructed for any T) x2.M(new T1[0], false); // Viable callables: {C4,C6}.{get_Prop(),set_Prop()} x2.Prop = x2.Prop; // Viable callables: {C4,C6}.{get_Item(),set_Item()} x2[default(T2)] = x2[default(T2)]; // Viable callables: {C4,C6}.{add_Event(),remove_Event()} x2.Event += () => { }; x2.Event -= () => { }; // Viable callables: {C2,C6}.M() C1 <string, int> x3 = Mock <C1 <string, int> >(); x3.M("abc", 42); // Viable callables: {C2,C6}.{get_Prop(),set_Prop()} x3.Prop = x3.Prop; // Viable callables: {C2,C6}.{get_Item(),set_Item()} x3[0] = x3[0]; // Viable callables: {C2,C6}.{add_Event(),remove_Event()} x3.Event += () => { }; x3.Event -= () => { }; // Viable callables: {C2,C3,C6}.M() C1 <string, decimal> x4 = Mock <C1 <string, decimal> >(); x4.M("abc", 42d); // Viable callables: {C2,C3,C6}.{get_Prop(),set_Prop()} x4.Prop = x4.Prop; // Viable callables: {C2,C3,C6}.{get_Item(),set_Item()} x4[0M] = x4[0M]; // Viable callables: {C2,C3,C6}.{add_Event(),remove_Event()} x4.Event += () => { }; x4.Event -= () => { }; // Viable callables: {C4,C6}.M() C1 <int[], bool> x5 = Mock <C1 <int[], bool> >(); x5.M <object>(new int[] { 42 }, null); // Viable callables: {C4,C6}.{get_Prop(),set_Prop()} x5.Prop = x5.Prop; // Viable callables: {C4,C6}.{get_Item(),set_Item()} x5[false] = x5[false]; // Viable callables: {C4,C6}.{add_Event(),remove_Event()} x5.Event += () => { }; x5.Event -= () => { }; // Viable callables: {C2,C5,C6}.M() C1 <string, bool> x6 = Mock <C1 <string, bool> >(); x6.M <object>("", null); // Viable callables: {C2,C5,C6}.{get_Prop(),set_Prop()} x6.Prop = x6.Prop; // Viable callables: {C2,C5,C6}.{get_Item(),set_Item()} x6[false] = x6[false]; // Viable callables: {C2,C5,C6}.{add_Event(),remove_Event()} x6.Event += () => { }; x6.Event -= () => { }; // Viable callables: C6.M() C1 <T1, bool> x7 = new C6 <T1, bool>(); x7.M(default(T1), ""); // Viable callables: C6.{get_Prop(),set_Prop()} x7.Prop = x7.Prop; // Viable callables: C6.{get_Item(),set_Item()} x7[false] = x7[false]; // Viable callables: C6.{add_Event(),remove_Event()} x7.Event += () => { }; x7.Event -= () => { }; // Viable callables: {C8,C9}.M() dynamic d = Mock <C8>(); d.M(Mock <IEnumerable <C4 <string> > >()); // Viable callables: {C8,C9}.{get_Prop(),set_Prop()} d.Prop1 = d.Prop1; // Viable callables: {C8,C9}.{get_Item(),set_Item()} d[0] = d[0]; // Viable callables: (none) d.M(Mock <IEnumerable <C4 <int> > >()); // Viable callables: C5.M() d = 42; C5.M(d); // Viable callables: C5.set_Prop2() d = ""; C5.Prop2 = d; // Viable callables: C5.{add_Event(),remove_Event()} d = (EventHandler <string>)(() => { }); C5.Event2 += d; C5.Event2 -= d; // Viable callables: (none) d = ""; C5.M(d); // Viable callables: (none) d = 0; C5.Prop2 = d; // Viable callables: (none) C5.Event2 += d; C5.Event2 -= d; // Viable callables: C8.M2() d = new decimal[] { 0M }; C8.M2 <decimal>(d); // Viable callables: C8.M2() d = new string[] { "" }; C8.M2 <string>(d); // Viable callables: (none) d = ""; C8.M2 <object>(d); // Viable callables: C6.M() d = new C6 <T1, byte>(); d.M(default(T1), ""); // Viable callables: C6.{get_Prop(),set_Prop()} d.Prop = d.Prop; // Viable callables: C6.{get_Item(),set_Item()} d[(byte)0] = d[(byte)0]; // Viable callables: C6.{add_Event(),remove_Event()} d.Event += (EventHandler <string>)(() => { }); d.Event -= (EventHandler <string>)(() => { }); // Viable callables: C8.M3(), C9.M3() d = Mock <C8>(); d.M3(); d.M3(0); d.M3(0, 0.0); // Viable callables: {C8,C9,C10}.M3() dyn.M3(); dyn.M3(0); dyn.M3(0, 0.0); // Viable callables: {C8,C9,C10}.{get_Prop1(),set_Prop1()} dyn.Prop1 = dyn.Prop1; // Viable callables: {C2,C3,C6,C7,C8,C9,C10}.{get_Item(),set_Item()} dyn[0] = dyn[0]; // Viable callables: {C2,C3,C5,C6,C7,C8,C9}.{add_Event(),remove_Event()} dyn.Event += (EventHandler <string>)(() => { }); dyn.Event -= (EventHandler <string>)(() => { }); // Viable callables: C8.M4() dyn.M4(0, Mock <IList <string> >()); dyn.M4(0, new string[] { "" }); // Viable callables: C10.set_Prop1() dyn.Prop1 = false; // Viable callables: (none) dyn.M4(-1, new string[] { "" }); dyn.M4(0, new int[] { 0 }); // Viable callables: (none) dyn.Prop1 = 0; // Viable callables: {C2,C6}.{get_Item(),set_Item()} dyn[""] = dyn[""]; // Operator calls using dynamic types: all target int operators d = 0; d = d + 1; d = 0; d = 1 - d; d = 0; d = d + t3; // mixed with a type parameter // Operator calls using reflection: targets C10 addition operator var c = new C10(); typeof(C10).InvokeMember("op_Addition", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, new object[] { c, c }); // Property call using reflection: targets C10 property getter/setter typeof(C10).InvokeMember("get_Prop3", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, new object[0]); typeof(C10).InvokeMember("set_Prop3", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, new object[] { "" }); // Indexer call using reflection: targets C10 indexer getter/setter typeof(C10).InvokeMember("get_Item", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, c, new object[] { 0 }); typeof(C10).InvokeMember("set_Item", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, c, new object[] { 0, true }); // Event handler call using reflection: targets C10 event adder/remover EventHandler <bool> e = () => { }; typeof(C10).InvokeMember("add_Event", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, c, new object[] { e }); typeof(C10).InvokeMember("remove_Event", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, c, new object[] { e }); }