Как динамически вызывать метод класса в .NET?

Как передать имя класса и метода в виде строки и вызвать метод этого класса?

Нравиться

void caller(string myclass, string mymethod){
    // call myclass.mymethod();
}

Спасибо


person pistacchio    schedule 13.07.2009    source источник


Ответы (3)


Вы можете использовать отражение.

Вот простой пример:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        caller("Foo", "Bar");
    }

    static void caller(String myclass, String mymethod)
    {
        // Get a type from the string 
        Type type = Type.GetType(myclass);
        // Create an instance of that type
        Object obj = Activator.CreateInstance(type);
        // Retrieve the method you are looking for
        MethodInfo methodInfo = type.GetMethod(mymethod);
        // Invoke the method on the instance we created above
        methodInfo.Invoke(obj, null);
    }
}

class Foo
{
    public void Bar()
    {
        Console.WriteLine("Bar");
    }
}

Теперь это очень простой пример, лишенный проверки ошибок, а также игнорирующий более серьезные проблемы, например, что делать, если тип находится в другой сборке, но я думаю, что это должно направить вас на правильный путь.

person Andrew Hare    schedule 13.07.2009
comment
До тех пор, пока сборка загружена и имя типа соответствует сборке, вы в золоте. - person Steven Sudit; 13.07.2009
comment
Хм... Я нашел ваш пример для возврата null в Type.GetType(myclass); - person pistacchio; 13.07.2009
comment
Это связано с тем, что сборка, содержащая myclass, еще не загружена в домен приложения. Вам нужно будет получить имя сборки от вызывающей стороны и выполнить Assembly.LoadFrom или один из многих вариантов, чтобы сначала загрузить сборку. - person ; 13.07.2009
comment
Как мне подойти к вызову Mailer.CallBack(xyz).Send(); Я вижу, как добиться вызова всего, кроме .send() в конце? Любая помощь приветствуется. - person Steve Newton; 23.09.2013
comment
Спасибо за вашу помощь, я получаю сообщение об ошибке parameter count mismatch на methodInfo.Invoke(obj, null) - person aadi1295; 13.04.2017

Что-то вроде этого:

public object InvokeByName(string typeName, string methodName)
{
    Type callType = Type.GetType(typeName);

    return callType.InvokeMember(methodName, 
                    BindingFlags.InvokeMethod | BindingFlags.Public, 
                    null, null, null);
}

Вы должны изменить флаги привязки в соответствии с методом, который вы хотите вызвать, а также проверить метод Type.InvokeMember в msdn, чтобы быть уверенным в том, что вам действительно нужно.

person Kenan E. K.    schedule 13.07.2009
comment
Вы правы, мои извинения. Отредактировано, чтобы добавить аргументы метода, которые нельзя опустить (C # 4.0, где ты) :) - person Kenan E. K.; 13.07.2009

По какой причине вы это делаете? Скорее всего, вы можете сделать это без отражения, вплоть до динамической загрузки сборки.

person clemahieu    schedule 13.07.2009