如果我有一个与委托参数模式匹配的混合类型列表,我该如何调用一个采用多个参数的委托?
How can I call a delegate that takes multiple parameters if I have a list of mixed type that matches the delegate parameter pattern?
我正在写一个简单的解释器。
对于函数调用,我有一个存储委托的哈希表,函数名称作为键。当我检索委托时,我可以检查是否输入并解析了正确的参数类型以传递给函数。
但是,这些参数在一个混合类型的列表中,并且委托参数是正常声明的。如何使用此参数列表调用任何代表?
例如
private Dictionary<string, Delegate> _functions = new Dictionary<String, Delegate>();
public string exFunc(int num, string text)
{
return num;
}
AddToDictionary(exFunc); //this is a method that calculates the correct delegate signature for any method and adds to _functions
List<paramTypes> parameters = new List<paramTypes>() {5,"hello"};
Delegate d = _functions["exFunc"];
如果已检查委托参数签名以便参数列表具有正确的类型,是否有办法执行类似以下操作?:
var res = d(ToSingleParams(parameters));
我查看了 "params" 关键字,但它仅适用于我能分辨的单一类型的数组。
感谢您的帮助!
正在将我的评论转换为答案。您需要使用 DynamicInvoke 方法来动态调用它。它有 params object[]
参数,可用于方法参数。在您的示例中,它将是这样的:
private Dictionary<string, Delegate> _functions = new Dictionary<String, Delegate>();
public string exFunc(int num, string text)
{
return num;
}
AddToDictionary(exFunc); //this is a method that calculates the correct delegate signature for any method and adds to _functions
List<paramTypes> parameters = new List<paramTypes>() {5,"hello"};
Delegate d = _functions["exFunc"];
d.DynamicInvoke(parameters.ToArray());
这是使用 DynamicInvoke
- https://dotnetfiddle.net/n01FKB
的工作示例
我正在写一个简单的解释器。
对于函数调用,我有一个存储委托的哈希表,函数名称作为键。当我检索委托时,我可以检查是否输入并解析了正确的参数类型以传递给函数。
但是,这些参数在一个混合类型的列表中,并且委托参数是正常声明的。如何使用此参数列表调用任何代表? 例如
private Dictionary<string, Delegate> _functions = new Dictionary<String, Delegate>();
public string exFunc(int num, string text)
{
return num;
}
AddToDictionary(exFunc); //this is a method that calculates the correct delegate signature for any method and adds to _functions
List<paramTypes> parameters = new List<paramTypes>() {5,"hello"};
Delegate d = _functions["exFunc"];
如果已检查委托参数签名以便参数列表具有正确的类型,是否有办法执行类似以下操作?:
var res = d(ToSingleParams(parameters));
我查看了 "params" 关键字,但它仅适用于我能分辨的单一类型的数组。
感谢您的帮助!
正在将我的评论转换为答案。您需要使用 DynamicInvoke 方法来动态调用它。它有 params object[]
参数,可用于方法参数。在您的示例中,它将是这样的:
private Dictionary<string, Delegate> _functions = new Dictionary<String, Delegate>();
public string exFunc(int num, string text)
{
return num;
}
AddToDictionary(exFunc); //this is a method that calculates the correct delegate signature for any method and adds to _functions
List<paramTypes> parameters = new List<paramTypes>() {5,"hello"};
Delegate d = _functions["exFunc"];
d.DynamicInvoke(parameters.ToArray());
这是使用 DynamicInvoke
- https://dotnetfiddle.net/n01FKB