【问题标题】:How can I execute a Method when I have its name as a string当我将其名称作为字符串时如何执行方法
【发布时间】:2012-05-16 01:52:46
【问题描述】:

今天面试(初级网络开发者)面试官问了我这个问题:

当方法名作为字符串时,如何执行方法(在 javascript 和 C# )

我无法回答:(

现在当我搜索时,我发现了这个问题How to execute a JavaScript function when I have its name as a string

但是如何在 c# 中做到这一点?

【问题讨论】:

  • 这个问题似乎是在尝试收集你是否知道 C# 的一个重要部分,反射。也许你应该阅读一本关于 C# 的书,而不是试图找到这个特定问题的答案。
  • 对于 c# 来说,更好的答案可能是“你应该避免这种情况。如果你需要它——那么你可能会以非常错误的方式做某事”
  • @Yuriy Faktorovich:我没有说没有理由使用反射。但我确实说过,当您需要通过名称调用方法时,这种情况是代码气味
  • 这可能是一个重复的问题。如果你在谷歌搜索,我想你可以很容易地找到它。总是先问谷歌,如果你没有得到想要的结果问 stackoverflow。
  • 这绝对是一个重复的问题:stackoverflow.com/questions/540066/… 还有更多关于 google 的信息:google.de/…

标签: c#


【解决方案1】:

如果您只有方法的名称,则可以使用 .net Relfection 仅运行该方法..

检查:MethodBase.Invoke Method (Object, Object[])

例子:

class Class1
   {
    public int AddNumb(int numb1, int numb2)
    {
      int ans = numb1 + numb2;
      return ans;
    }

  [STAThread]
  static void Main(string[] args)
  {
     Type type1 = typeof(Class1); 
     //Create an instance of the type
     object obj = Activator.CreateInstance(type1);
     object[] mParam = new object[] {5, 10};
     //invoke AddMethod, passing in two parameters
     int res = (int)type1.InvokeMember("AddNumb", BindingFlags.InvokeMethod,
                                        null, obj, mParam);
     Console.Write("Result: {0} \n", res);
   }
  }

【讨论】:

    【解决方案2】:

    假设你有这个类型,你可以使用反射通过它的名字来调用一个方法。

    class Program
    {
        static void Main()
        {
            var car = new Car();
            typeof (Car).GetMethod("Drive").Invoke(car, null);
        }
    }
    
    public class Car
    {
        public void Drive()
        {
            Console.WriteLine("Got here. Drive");
        }
    }
    

    如果您正在调用的方法包含参数,您可以按照与方法签名相同的顺序将参数作为对象数组传递给Invoke

    var car = new Car();
    typeof (Car).GetMethod("Drive").Invoke(car, new object[] { "hello", "world "});
    

    【讨论】:

    • 为什么不使用 car.GetType() 而不是 typeof(Car)?
    【解决方案3】:

    好文章。 完整阅读。不仅可以从字符串中调用方法,还可以从很多场景中调用。

    http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A-Method-Given-Strings-with-Met

    How to call a shared function which its name came as a parameter

    【讨论】:

    • 否定的?请说明原因?
    • -1。如果您只想提供链接 - 请考虑 cmets 或建议“关闭为重复”,如果链接上的确切问题。否则请提供链接摘要。
    • @AlexeiLevenkov 这个链接包含他需要的信息和其他可能的实现反射的方法。无论如何,如果我在这里复制代码,他需要访问链接以获取更多信息。所以我确实喜欢这个。对此我深表歉意,并感谢您的评论。 :)
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多