2

所以说我有一个叫做 fun 的字符串。它的文本是“myFun”。我想运行一个名为 myFun 的函数:

private void myFun()
{
  //stuff
}

有没有办法做到这一点,以便我可以根据字符串的文本运行它?也许是这样的:

myFun + ();

显然这行不通,但是有什么可以吗?

4

5 回答 5

2

鉴于我有这堂课:

public class Foo
{
    private void myFun()
    {
        Console.WriteLine("Hello, World!");
    }
}

我可以调用这段代码:

var fun = "myFun";
var foo = new Foo();
foo
    .GetType()
    .GetMethod(
        fun,
        BindingFlags.NonPublic
            | BindingFlags.Instance
            | BindingFlags.InvokeMethod)
    .Invoke(foo, new object[] { });

我想,这就是你想要的。

于 2012-08-04T03:37:43.703 回答
2

全球成员

delegate void aFunction();

构造函数或初始化函数

Dictionary<string, aFunction> myfunctions = new Dictionary<string, aFunction>();
myfunctions.Add("myFun", myFun);

从字符串调用你的函数

myfunctions["myFun"].Invoke();
于 2012-08-04T03:39:12.593 回答
1

你可以通过反射来做到这一点。假设myFun是您调用它的同一类的成员:

var t = typeof( this );
t.InvokeMember(myFun,
               BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
               null, this, null);
于 2012-08-04T03:34:59.707 回答
0

正如亚历克斯建议的那样,您可以使用反射;或者如果你不需要能够运行任何给定的函数,你可以定义一个Dictionary在名称和函数之间映射的。

于 2012-08-04T03:37:38.430 回答
0

这可能不是您正在寻找的,但您可以使用扩展方法完成几乎您想要的。

定义一个公共静态类并添加方法如下...

public static string ny(this string str)
{
    //.. do something
}

然后导入您的扩展类,您可以直接在您的字符串对象上调用该函数。

myFun.ny();

扩展方法的关键是添加到参数的this关键字。同样,可能不完全是您正在寻找的东西,但它应该可以工作。

于 2012-08-04T04:44:59.097 回答