Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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#_Dynamic - Fatal编程技术网

C# 动态调用具有相同签名的方法

C# 动态调用具有相同签名的方法,c#,dynamic,C#,Dynamic,假设我有一门课是这样的: class SomeClass { public void ActionFunction() { } public void Do1(int num) {...} public void Do2(int num) {...} etc. } 在ActionFunction中,我想读取字符串,然后调用任何Do(Do1,Do2,等等)。由于所有函数都有相同的签名,我认为这是代表们的工作。但是不能将函数的字符串名传递给委托,我正试图避免使用一个巨大的开关来确定调用哪个

假设我有一门课是这样的:

class SomeClass
{

public void ActionFunction()
{
}

public void Do1(int num) {...}

public void Do2(int num) {...}

etc.
}
ActionFunction
中,我想读取字符串,然后调用任何Do(
Do1
Do2
,等等)。由于所有函数都有相同的签名,我认为这是代表们的工作。但是不能将函数的字符串名传递给委托,我正试图避免使用一个巨大的开关来确定调用哪个函数


我意识到我可以使用反射来实现这一点,但由于性能原因,我试图避免使用反射。

我会制作一个
字典,其中键是字符串,值是要调用的方法的委托。然后您可以执行类似于dict[“string”].Value.Invoke()的操作
。您甚至可以使用反射来加载字典值,因为这将是一次性的预付费用,而且调用会很快

private Dictionary<string, Action<int>> doMethods = new Dictionary<string, Action<int>>();
public SomeClass()
{
    Type t = typeof(SomeClass);
    var methods = t.GetMethods().Where(m => m.Name.StartsWith("Do"));

    foreach(var method in methods)
         doMethods.Add(method.Name, (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), this, method, true));
}

public void ActionFunction(string name, int num)
{
    this.doMethods[name](num);
}
private Dictionary doMethods=new Dictionary();
公共类()
{
t型=类型(SomeClass);
var methods=t.GetMethods(),其中(m=>m.Name.StartsWith(“Do”);
foreach(方法中的var方法)
Add(method.Name,(Action)Delegate.CreateDelegate(typeof(Action),this,method,true));
}
public void ActionFunction(字符串名,int num)
{
this.doMethods[name](num);
}

如果您使用的是.net 4.0,开源框架可以使用dlr根据名称调用您的操作


这也是我的建议,除了
Func
是不合法的-使用
Action
代替。我需要ActionFunction接收一个要运行的命令文件,命令是Do1、Do2等。操作的顺序和集合可以根据用户的不同而变化。如果不写太多的话,很难深入到更多的细节,但这正是我想要做的。
Impromptu.InvokeMemberAction(target, actionName, num);