Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: pistacchioОтветов: 3

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

Нравиться

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

Спасибо

reflection

Ответы

Ответ 1 · рейтинг 34 · Andrew Hare

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

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

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");
    }
}

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

Ответ 2 · рейтинг 9 · Kenan E. K.

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

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, чтобы быть уверенным в том, что вам действительно нужно.

Ответ 3 · рейтинг -3 · clemahieu

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы