C# 作为参数传递方法或函数
我有一个Lua脚本的抽象类。我有一个名为C# 作为参数传递方法或函数,c#,C#,我有一个Lua脚本的抽象类。我有一个名为Expose的方法,它向Lua环境注册一个函数 protected void Expose(string name, MethodBase method) { this.Lua.RegisterFunction(name, this, method); } 但是,我想通过只传递方法名而不是这样做来简化: this.Expose(this.GetType().GetMethod(... 我希望能够做到这一点: this.E
Expose
的方法,它向Lua环境注册一个函数
protected void Expose(string name, MethodBase method)
{
this.Lua.RegisterFunction(name, this, method);
}
但是,我想通过只传递方法名而不是这样做来简化:
this.Expose(this.GetType().GetMethod(...
我希望能够做到这一点:
this.Expose(LuaExports.DoSomething);
因此,除了通过MethodBase,我还需要通过什么?请注意,传递的参数可以是返回某些内容的方法,也可以是不返回任何内容的方法 您需要两个方法,一个接受
操作
委托(无效方法),另一个接受函数
委托(返回T
的方法):
protectedvoid Expose(字符串名称、操作方法)
{
方法();//将调用传递的方法。
}
受保护的void Expose(字符串名称,Func方法)
{
var value=method();//将调用传递的方法并将返回结果赋给value。
}
您需要两个方法,一个接受操作
委托(无效方法),另一个接受函数
委托(返回T
的方法):
protectedvoid Expose(字符串名称、操作方法)
{
方法();//将调用传递的方法。
}
受保护的void Expose(字符串名称,Func方法)
{
var value=method();//将调用传递的方法并将返回结果赋给value。
}
我认为您能达到的最接近的方法是直接传递委托类型:
protected void Expose(string name, Delegate delegate)
{
this.Lua.RegisterFunction(name, d.Target, d.Method);
}
尽管要调用此函数,您必须创建委托类型,这可以通过强制转换完成:
this.Expose("Name", (Action)LuaExports.DoSomething);
如果您不想进行强制转换,则必须编写一系列暴露的遗传重载,每个重载采用单独的委托类型:
Expose(string name, Action action);
Expose<T1>(string name, Action<T1> action);
Expose<T1, T2>(string name, Action<T1, T2> action);
...
Expose<T1, TResult>>(string name, Func<T1, TResult> action);
Expose<T1, T2, TResult>>(string name, Action<T1, T2, TResult>> action);
...
Expose(字符串名称、操作);
公开(字符串名称、操作);
公开(字符串名称、操作);
...
Expose>(字符串名称,函数操作);
Expose>(字符串名称,操作>操作);
...
我认为您能达到的最接近的方法是直接传递委托类型:
protected void Expose(string name, Delegate delegate)
{
this.Lua.RegisterFunction(name, d.Target, d.Method);
}
尽管要调用此函数,您必须创建委托类型,这可以通过强制转换完成:
this.Expose("Name", (Action)LuaExports.DoSomething);
如果您不想进行强制转换,则必须编写一系列暴露的遗传重载,每个重载采用单独的委托类型:
Expose(string name, Action action);
Expose<T1>(string name, Action<T1> action);
Expose<T1, T2>(string name, Action<T1, T2> action);
...
Expose<T1, TResult>>(string name, Func<T1, TResult> action);
Expose<T1, T2, TResult>>(string name, Action<T1, T2, TResult>> action);
...
Expose(字符串名称、操作);
公开(字符串名称、操作);
公开(字符串名称、操作);
...
Expose>(字符串名称,函数操作);
Expose>(字符串名称,操作>操作);
...
为什么不让代理重复?@GilbertWilliams放松点。。。只是想帮忙。我很确定你不能同时传递一个代理,这就是为什么我认为这是一个重复的代理。@DrewJordan对不起,我只是讨厌这里的人立即将帖子标记为重复的。np。有时不是,有时是。。。这就是为什么我的国旗被标记为可能的复制品,并且在正式标记为复制品之前需要其他人的同意。这不是我第一次错了。可能是重复的,为什么不当代表?@GilbertWilliams别紧张。。。只是想帮忙。我很确定你不能同时传递一个代理,这就是为什么我认为这是一个重复的代理。@DrewJordan对不起,我只是讨厌这里的人立即将帖子标记为重复的。np。有时不是,有时是。。。这就是为什么我的国旗被标记为可能的复制品,并且在正式标记为复制品之前需要其他人的同意。这不是我第一次错了。如果我不知道Func的类型呢?另外,如何将它们转换为MethodBase?Lua.RegisterFunction将MethodBase作为参数…使用“object”或其他。。。如果您使用“T”作为泛型类型声明类,David给您的解决方案是可行的。@GilbertWilliams,您怎么可能不知道它?是否使用返回值?如果没有,只需使用第一个选项并使用()=>method()
作为参数。这样,通过Action
lambda调用带有返回的方法,您只需要该版本。如果我不知道Func的类型怎么办?另外,如何将它们转换为MethodBase?Lua.RegisterFunction将MethodBase作为参数…使用“object”或其他。。。如果您使用“T”作为泛型类型声明类,David给您的解决方案是可行的。@GilbertWilliams,您怎么可能不知道它?是否使用返回值?如果没有,只需使用第一个选项并使用()=>method()
作为参数。这样,通过Action
lambda调用带有返回的方法,您只需要该版本。