Вопрос по вызову метода с использованием отражения - PullRequest
0 голосов
/ 17 апреля 2011

Прекрасный солнечный день сегодня!Однако я не могу наслаждаться этим, потому что я пытался вызвать динамический метод в Mono в течение 2 дней: - (

История:

Я пытаюсь вызвать его внутрикласс с именем «Template». По сути, мне бы понравилось, если бы я мог передать строку в 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: Метод не найден:' Конструктор по умолчанию не найден ...ctor () Mash.Template '.'

Я думаю, что здесь это не работает:

object ob = Activator.CreateInstance(type);

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо заранее !!

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

вам не нужен другой экземпляр 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 голос
/ 17 апреля 2011

Первый аргумент Activator.CreateInstance является типом класса, а затем следует аргументу конструктора типа.

Вы пытаетесь создать экземпляр класса Template, не используя параметров для конструктора. Но нет конструктора без параметров.

Попробуйте добавить конструктор в ваш класс Template, который не принимает параметров:

public class Template
{
    //......
    public Template()
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...