Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为参数传递方法或函数_C# - Fatal编程技术网

C# 作为参数传递方法或函数

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

我有一个Lua脚本的抽象类。我有一个名为
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调用带有返回的方法,您只需要该版本。