您说您希望保持参数的数量和类型开放,但您可以使用委托来做到这一点:
public delegate object DynamicFunc(params object[] parameters);
这与您目前拥有的完全相同。尝试这个:
class Program
{
static void Main(string[] args)
{
DynamicFunc f = par =>
{
foreach (var p in par)
Console.WriteLine(p);
return null;
};
f(1, 4, "Hi");
}
}
您可以将实例方法委托视为与您的非常相似Function
类:一个对象aMethodInfo
。所以没有必要重写它。
此外,C 和 C++ 中的函数指针与您所需要的并不接近:它们不能绑定到对象实例and函数,而且它们是静态类型的,而不是动态类型的。
如果您想在 Dynamic Func 委托中“包装”任何其他方法,请尝试以下操作:
public static DynamicFunc MakeDynamicFunc(object target, MethodInfo method)
{
return par => method.Invoke(target, par);
}
public static void Foo(string s, int n)
{
Console.WriteLine(s);
Console.WriteLine(n);
}
进而:
DynamicFunc f2 = MakeDynamicFunc(null, typeof(Program).GetMethod("Foo"));
f2("test", 100);
请注意,我使用的是静态方法Foo
所以我通过了null
对于实例,但如果它是实例方法,我将传递要绑定的对象。Program
恰好是我定义静态方法的类。
当然,如果您传递了错误的参数类型,那么您会在运行时收到错误。我可能会寻找一种设计程序的方法,以便在编译时捕获尽可能多的类型信息。