【问题标题】:Is there a way to run a function off a string?有没有办法从字符串中运行函数?
【发布时间】:2012-08-04 03:29:02
【问题描述】:

假设我有一个名为 fun 的字符串。它的文本是“myFun”。我想运行一个名为 myFun 的函数:

private void myFun()
{
  //stuff
}

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

myFun + ();

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

【问题讨论】:

  • 字符串是什么?你到底想达到什么目标?
  • 我很难理解您想要做什么。也许用你的字符串“myFun”发布一些代码以及你想用它做什么。
  • 所以如果我有一个名为 fun 的字符串,我希望能够根据它的文本运行一个函数,这样我就可以运行函数 fun()、funiful()、epic() 等,基于文本的内容(有趣、有趣、史诗等)

标签: c# function delegates


【解决方案1】:

鉴于我有这门课:

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[] { });

我想,这就是你想要的。

【讨论】:

    【解决方案2】:

    全球成员

    delegate void aFunction();
    

    构造函数或初始化函数

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

    从字符串调用你的函数

    myfunctions["myFun"].Invoke();
    

    【讨论】:

    • +1。我认为使用字符串字典 - 代表/函数/动作是正确的方法,但前提是您知道所有情况下的签名都是相同的。否则,一个简单的if 语句调用不同的方法将起作用,并在每种情况下传递您需要的参数。
    【解决方案3】:

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

    var t = typeof( this );
    t.InvokeMember(myFun,
                   BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                   null, this, null);
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 喜欢Dictionary&lt;string, Action&gt; ?
      • 是的。或者最适合您的特定功能的任何类型。
      【解决方案5】:

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

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

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

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

      myFun.ny();
      

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

      【讨论】:

        猜你喜欢
        • 2011-11-30
        • 2022-10-21
        • 2017-08-17
        • 2020-04-12
        • 2020-11-30
        • 2021-10-04
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多