关于使用反射调用方法的问题

时间:2011-04-17 11:32:47

标签: c# reflection

今天美丽的晴天!但是,我无法享受它,因为我一直试图在Mono中使用动态方法2天: - (

故事:

我试图在名为“模板”的类中调用它。基本上我会喜欢它,如果我可以将一个字符串传递给Template并让它运行该方法,该方法在Template类中定义。到目前为止,模板类看起来像这样..

namespace Mash
{
    public class Template
    {
        public Template(string methodToCall)
        {
            Type type = this.GetType();
            object ob = Activator.CreateInstance(type);
            object[] arguments = new object[52];
            type.InvokeMember(methodToCall,
                          BindingFlags.InvokeMethod,
                          null,
                          ob,
                          arguments);
        }
        public void methodIWantToCall()
        {
            Console.WriteLine("I'm running the Method!");
        }
    }
}

编译期间没有收到任何错误。然而,一旦我运行它,我得到了

  

'未处理的异常:System.MissingMethodException:找不到方法:'未找到默认构造函数... Mash.Template的ctor()'。'

我认为这是失败的:

object ob = Activator.CreateInstance(type);

如果您需要更多信息,请告诉我们。

提前致谢!!

2 个答案:

答案 0 :(得分:2)

如果您要调用的方法位于同一个类中,则不需要另一个Template实例。您可以使用 this

    public class Template
    {        
        public Template(string methodToCall)
        {
              this.GetType().InvokeMember(methodToCall,
                          BindingFlags.InvokeMethod,
                          null,
                          this,
                          null);

        }
        public void methodIWantToCall()
        {
            Console.WriteLine("I'm running the Method!");
        }
   }

我测试了它:

class Program
{
    public static void Main(string[] args)
    {
        Template m = new Template("methodIWantToCall");
        Console.ReadKey(true);

    }
 }

答案 1 :(得分:1)

Activator.CreateInstance的第一个参数是类的类型,然后是类型构造函数的参数。

您正在尝试使用构造函数的无参数创建Template类的实例。但是没有没有参数的构造函数。

尝试在Template类中添加构造函数,该类不带参数:

public class Template
{
    //......
    public Template()
    {
    }
}