【问题标题】:How to call a Method from String using c#? [duplicate]如何使用 c# 从字符串调用方法? [复制]
【发布时间】:2012-07-26 14:57:56
【问题描述】:

我创建了一个类库,其中有 4 个类,每个类有 1 个方法。 头等舱是我的主要课程,在我的头等舱中,我有一个名为 calltoaction 的字符串,在这个字符串中我将动态获取以下列表中的一个

  1. class2.Method2()
  2. class3.Method3()
  3. class4.Method4()

现在我想从字符串“calltoaction”执行“class2.method2”。

例如:

class Class1
{
    public void method1()
    {
        string calltoaction = "Class2.Method2()";
    }
}

如何从字符串中执行“Class2.Method”?

【问题讨论】:

  • 你能解释清楚一点吗?如果你只是想让method1() 调用Class2.Method2() 那么什么时候不直接调用呢?
  • 虽然可以这样做,但通常不应该这样做。你为什么要这样做?很可能有更好的方法。
  • 您要查找的内容称为Reflection。已经有很多关于这个主题的教程。也许您可以先阅读这些内容。
  • 如果您希望能够在不使用 switch 语句预定义的情况下调用任何方法,则需要使用反射。然后,您可以查找与您传入的名称匹配的方法,然后调用它。
  • 这真是一个奇怪的要求!仍然有可能这只是一个展示概念的假场景。无论如何,c# 依赖于面向对象的范式并拥有一个称为多态的概念。这意味着您有一个可以实现多个类的接口,并且调用者不需要耦合到特定的类。答案中有人建议您也有机会使用代表。以这种方式使用反射称为滥用。

标签: c#


【解决方案1】:

我不完全确定您想要完成什么,但我相信它可以以更好的方式完成。基本上,如果我正确理解您的问题,调用此函数会返回您希望执行的类和方法的名称。

如果是这样,我会无限期地放弃整个“字符串”并开始查看代表。

考虑一下:

public class Class2
{
    public static void Method2() { } 
} // eo class 2

public class Class3
{
    public static void Method3() { } 
} // eo class 3

public class Class4
{
    public static void Method4() { } 
} // eo class 4

现在我们来到我们的主要课程

public class MainClass
{
    private delegate void MethodDelegate();
    private List<MethodDelegate> delegates_ = new List<MethodDelegate>();

    // ctor
    public MainClass()
    {
        delegates_.Add(Class2.Method2);
        delegates_.Add(Class3.Method3);
        delegates_.Add(Class4.Method4);
    }

    // Call a method
    public void Method1()
    {
        // decide what you want to call:
        delegates_[0].Invoke(); // "Class2.Method2"
    } // eo Method1
}  // eo class Main

【讨论】:

  • 我将在字符串中获得一个方法一次,我想立即执行该方法。例如: String calltoaction = "Class2.Method2" ,一旦将值分配给字符串,我想立即调用该方法。
  • 您可能需要详细说明您想要做什么。可以像任何其他变量类型一样返回、传递和使用委托。然后只需调用Invoke() 来执行它。我仍然不明白为什么您可能需要字符串表示形式。
  • 您可以在 98% 的时间里为您的代表使用 FuncAction;这些天很少需要创建自己的。这样做有助于使代码更清晰。另外,不用调用invoke 方法,您可以只写delegates_[0]();(只需在委托变量后面加上带参数的括号)。
  • @Servy,在某些情况下FuncAction 并不是特别理想。另外,感谢您指出 - 但Invoke 是个人偏好,因为它很清楚我在做什么。我知道我可以按照你的建议来称呼它,但由于可读性,这是我的一个习惯:)
  • @Moo-Juice 正如我所说,FuncAction 应用 98% 的时间,而不是 100% 的时间。这是仅Action 就可以的情况之一。只有当您需要 ref/out 参数、表示泛型方法以及其他一些此类边缘情况时,您才能使用它们,但它们非常罕见。仅仅因为它们不适用于每种情况并不意味着您永远不应该使用它们。
【解决方案2】:

使用Action 而不是字符串(假设您不需要返回值。如果需要,请使用Func):

这是一个关于如何使用它的想法:

public Form1()
{
    InitializeComponent();

    Action<string> calltoaction;
    calltoaction = Doit;
    calltoaction("MyText1");
    calltoaction = Doit2;
    calltoaction("MyText2");
}

void Doit(string s)
{ Text = s; }

void Doit2(string s)
{ textBox1.Text = s; }

【讨论】:

    【解决方案3】:

    我想一个低技术的方法是使用这样的 switch 语句:

    using System;
    
    namespace ConsoleApplication24
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Which method would you like to run?");
                RunMyMethod(Console.ReadLine());
            }
    
            private static void RunMyMethod(string p)
            {
                switch (p)
                {
                    case "MethodOne();":
                        MethodOne();
                        break;
                    case "MethodTwo();":
                        MethodTwo();
                        break;
                    case "MethodThree();":
                        MethodThree();
                        break;
                }
            }
    
            private static void MethodThree()
            {
                //Do Stuff
            }
    
            private static void MethodTwo()
            {
                //Do Stuff
            }
    
            private static void MethodOne()
            {
                //Do Stuff
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 2013-01-26
      • 2012-06-22
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多