using System;
using System.Reflection;
public class Test
{
delegate T Param<T>(params object[] args);
static Param<T> skipArg<T>(Type type, string method, int ind, object value, Type[] types = null)
{
MethodInfo mi;
if (types == null) mi = type.GetMethod(method);
else mi = type.GetMethod(method, types);
return delegate (object[] _args)
{
int len = _args.Length;
object[] args = new object[len + 1];
Array.Copy(_args, 0, args, 0, ind);
Array.Copy(_args, ind, args, 1 + ind, len - ind);
args[ind] = value;
return (T)mi.Invoke(null, args);
};
}
static void Main()
{
Param<double>
pow2_ = skipArg<double>(typeof(Math), "Pow", 0, 2),
pow_2 = skipArg<double>(typeof(Math), "Pow", 1, 2);
var hw = skipArg<int?>(typeof(Console), "WriteLine", 0, "Hellow world!", new Type[] { typeof(string) });
hw(); hw(); hw();
Console.WriteLine("2 ^ 3 = {0}", pow2_(3)); // 2 ^ 3 = 8
Console.WriteLine("3 ^ 2 = {0}", pow_2(3)); // 3 ^ 2 = 9
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKCnB1YmxpYyBjbGFzcyBUZXN0CnsgICAgICAgIAoJZGVsZWdhdGUgVCBQYXJhbTxUPihwYXJhbXMgb2JqZWN0W10gYXJncyk7CiAgICBzdGF0aWMgUGFyYW08VD4gc2tpcEFyZzxUPihUeXBlIHR5cGUsIHN0cmluZyBtZXRob2QsIGludCBpbmQsIG9iamVjdCB2YWx1ZSwgVHlwZVtdIHR5cGVzID0gbnVsbCkKICAgIHsKICAgICAgICBNZXRob2RJbmZvIG1pOwogICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSBtaSA9IHR5cGUuR2V0TWV0aG9kKG1ldGhvZCk7CiAgICAgICAgZWxzZSBtaSA9IHR5cGUuR2V0TWV0aG9kKG1ldGhvZCwgdHlwZXMpOwogICAgICAgIHJldHVybiBkZWxlZ2F0ZSAob2JqZWN0W10gX2FyZ3MpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuID0gX2FyZ3MuTGVuZ3RoOwogICAgICAgICAgICBvYmplY3RbXSBhcmdzID0gbmV3IG9iamVjdFtsZW4gKyAxXTsKICAgICAgICAgICAgQXJyYXkuQ29weShfYXJncywgMCwgYXJncywgMCwgaW5kKTsKICAgICAgICAgICAgQXJyYXkuQ29weShfYXJncywgaW5kLCBhcmdzLCAxICsgaW5kLCBsZW4gLSBpbmQpOwogICAgICAgICAgICBhcmdzW2luZF0gPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIChUKW1pLkludm9rZShudWxsLCBhcmdzKTsKICAgICAgICB9OwogICAgfQoKICAgIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIFBhcmFtPGRvdWJsZT4KICAgICAgICAgICAgcG93Ml8gPSBza2lwQXJnPGRvdWJsZT4odHlwZW9mKE1hdGgpLCAiUG93IiwgMCwgMiksCiAgICAgICAgICAgIHBvd18yID0gc2tpcEFyZzxkb3VibGU+KHR5cGVvZihNYXRoKSwgIlBvdyIsIDEsIDIpOwogICAgICAgIHZhciBodyA9IHNraXBBcmc8aW50Pz4odHlwZW9mKENvbnNvbGUpLCAiV3JpdGVMaW5lIiwgMCwgIkhlbGxvdyB3b3JsZCEiLCBuZXcgVHlwZVtdIHsgdHlwZW9mKHN0cmluZykgfSk7CiAgICAgICAgaHcoKTsgaHcoKTsgaHcoKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiMiBeIDMgPSB7MH0iLCBwb3cyXygzKSk7IC8vIDIgXiAzID0gOAogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIzIF4gMiA9IHswfSIsIHBvd18yKDMpKTsgLy8gMyBeIDIgPSA5CiAgICB9Cn0=