1

我想在 C# 中执行一系列函数。这些函数名称存储在数据库中例如我有这个函数:

功能1,功能2,功能3

我想运行一个查询并且查询返回给我,例如,Function1&的名称Function2

所以问题是当我从数据库中检索它们时如何运行它们?

或者例如,如果我的函数名称存储在数组中。

我想在数组索引 2 和 4 中调用函数。只需 2 和 4 ......然后他们执行他们

4

3 回答 3

3

假设您在一个类中有您的函数,您可以执行以下操作:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(RunFunction("Function1"));
    }
    static object RunFunction(string functionName)
    {
        MethodInfo[] methodInfos = typeof(CallableFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance);
        var callableFunctions = new CallableFunctions();
        return methodInfos.First(mi => mi.Name == functionName).Invoke(callableFunctions, null);
    }
}
class CallableFunctions
{
    public string Function1()
    {
        return "Abc";
    }
    public string Function2()
    {
        return "Def";
    }
}

Method RunFunction 执行 Callable Functions 类中的(无参数)方法并打印它的返回值

请注意,这可能是一种糟糕的编程风格。如果你没有充分的理由这样做,那就不要

备注:
根据您要达到的目标,还有其他几种可能性。您可以在 Sql Server 中编写存储过程/TVF,或者如果您使用的是 MS-SQL,您可以为数据库创建一个 CLR 项目并将 C# 方法部署到 SQL Server 并在那里执行它们。
或者您可以根据结果有条件地执行分支。您在这里尝试做的事情可能非常危险。

于 2013-09-13T17:05:23.650 回答
2

试试这个:

public partial class Default2 : System.Web.UI.Page
{
  protected void Button1_Click(object sender, EventArgs e)
  {
      string[] arr = { "func1", "func2" };
      System.Reflection.MethodInfo methodInfo = typeof(Default2).GetMethod(arr[0]);
      if (methodInfo != null)
      {
          methodInfo.Invoke(this, null);
      }
  }
  public void func1()
  {
      Response.Write("func1");
  }
  public void func2()
  {
      Response.Write("func2");
  }
}

笔记:

必须指定函数的 访问类型(公共、私有、受保护)。

于 2013-09-13T17:42:50.637 回答
0

我可以给你一个方法来做这件事。

如果函数的名称是已知的且有限的,您可以通过使用传递给函数的参数来实现一个函数来切换每个函数。即这是一个伪代码。

FUNCTION(INT functionCode)
    SWITCH(functionCode)
        CASE code1:
            CALL FUNCTION1
        CASE code2:
            CALL FUNCTION2
    END
END

functionCode现在您可以根据查询结果解析并调用此包装函数。如果需要调用多个函数,可以重复调用这个包装函数。但问题是,如果您需要将参数解析为 FUNCTION1、FUNCTION2 等。在这种情况下,您必须将这些参数捆绑为一个对象并将其解析为包装函数。

这是通用的答案。似乎第一个答案集中在您的问题上。

于 2013-09-13T17:13:54.860 回答