Как можно динамически вызывать метод в С#

У меня есть класс, и в этом классе у меня много методов, и я хочу вызвать все методы без записи имени

Это мой код, и он работает:

System.Reflection.MethodInfo[] methods = typeof(content).GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
        foreach (System.Reflection.MethodInfo m in methods)
        {
            Response.Write(typeof(content).GetMethod(m.Name).Invoke(null,null).ToString());
}

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

Что мне сделать, чтобы получить их все? что случилось ?


person Mohammad Esmaeili    schedule 10.06.2015    source источник
comment
Вы уверены, что у вас есть более одного общедоступного статического метода?   -  person Alioza    schedule 10.06.2015
comment
Попробуйте Response.Write(m.Invoke(null,null).ToString());   -  person Oleg    schedule 10.06.2015
comment
Ваш вызов вызова не включает объект, для которого вы вызываете этот метод. Например, если вы посмотрите на решение здесь (stackoverflow.com/questions/801070/) вызывает вызов объекта, который является экземпляром этого типа: method.Invoke(instance, null);.   -  person Alexandru    schedule 10.06.2015
comment
@Alioza, да, я уверен, я написал, что Response.Write(m.Name); вернул все имена методов.   -  person Mohammad Esmaeili    schedule 10.06.2015
comment
@ Олег : я кое-что сделал , как ты говоришь , но снова получил ответ   -  person Mohammad Esmaeili    schedule 10.06.2015
comment
@Александру, я кое-что сделал, как ты сказал, но снова получил ответ   -  person Mohammad Esmaeili    schedule 10.06.2015
comment
Возвращает ли он только один метод, а затем нормально завершает работу или выдает исключение или что-то в этом роде?   -  person sirdank    schedule 10.06.2015
comment
@sirdank: моя проблема была решена, спасибо за вопрос   -  person Mohammad Esmaeili    schedule 10.06.2015


Ответы (2)


Вам нужно вызывать каждый метод для экземпляра. В приведенном ниже примере .Invoke() вызывается для экземпляра Content. Тем не менее, вы также делаете избыточный вызов GetMethod(). Вы можете использовать MethodInfo напрямую.

void Main()
{
    var content = new Content();

    System.Reflection.MethodInfo[] methods = typeof(Content).GetMethods(
        System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);

    foreach (System.Reflection.MethodInfo m in methods)
    {
        Response.Write(m.Invoke(content, null).ToString());
    }
}

public class Content
{
    public static void Test1() {}
    public static void Test2() {}
}
person David L    schedule 10.06.2015

Являются ли все методы, которые вы хотите выполнить, public и static? Хорошо. Теперь проверьте, передаете ли вы правильные параметры каждому методу, который хотите вызвать.

Invoke(null, null) работает только для методов, не принимающих параметров. Если вы попытаетесь вызвать методы, требующие параметров, с помощью .Invoke(null, null), будет выдано исключение.

Например, если у вас есть два метода

public static void Example1() { ... }
public static void Example2(string example) { ... }

Этот код запустит Example1(), распечатает его, а затем вылетит при попытке передать 0 параметров в Example2(). Чтобы вызвать Example2(), вам понадобится .Invoke(null, new object[1])

person sirdank    schedule 10.06.2015