Как вызвать метод с необязательными параметрами, используя отражения c#

#c# #.net-core #system.reflection

Вопрос:

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

 Void Method1(string request, string constants, string count = null)

Void Method2(string request, string constants)
 

В методе 1 параметр count является необязательным.Для вышеуказанных методов я вызываю, используя отражения
Вот код :

 result = methodInfo.Invoke(classInstance, new object[] {request, constants});
 

Я пробовал использовать подход ниже, но получил исключение

 result = methodInfo.Invoke(classInstance, new object[] {request, constants ,System.Type.Missing});
 

Приведенное ниже исключение для метода 2 приведенный выше код работает для метода 1

Несоответствие количества параметров.

Пожалуйста, предложите мне дополнительные параметры в методе с использованием отражений

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

Ответ №1:

Необязательные параметры: на самом деле не являются необязательными — все, что происходит, это то, что компилятор обычно автоматически предоставляет вам пропущенное значение. Поскольку вы здесь не используете компилятор, вам нужно будет предоставить его самостоятельно, используя new object[] {request, constants, null} . Обратите внимание, что если вы хотите должным образом соблюдать значение по умолчанию (вместо того , чтобы знать, что null в данном случае это так), вам нужно будет посмотреть ParameterInfo , в частности .HasDefaultValue , и .DefaultValue .

Пример (не используется ParameterInfo , примечание):

 using System;
using System.Reflection;

class P
{
    static void Main()
    {
        string request = "r", constants = "c", count = "#";
        var classInstance = new P();

        typeof(P).GetMethod(nameof(Method1),
            BindingFlags.Instance | BindingFlags.NonPublic)
            .Invoke(classInstance, new object[] { request, constants, null });

        typeof(P).GetMethod(nameof(Method1),
            BindingFlags.Instance | BindingFlags.NonPublic)
            .Invoke(classInstance, new object[] { request, constants, count });

        typeof(P).GetMethod(nameof(Method2),
            BindingFlags.Instance | BindingFlags.NonPublic)
            .Invoke(classInstance, new object[] { request, constants });
    }

    void Method1(string request, string constants, string count = null)
        => Console.WriteLine($"#1: {request}, {constants}, {count}");

    void Method2(string request, string constants)
        => Console.WriteLine($"#2: {request}, {constants}");
}
 

Комментарии:

1. ,Спасибо вам за немедленный ответ. Я попытался, указав новый объект[] {запрос, константы, null}, но все равно столкнулся с тем же несоответствием количества параметров ошибки. для метода 2 . Не могли бы вы, пожалуйста, проводить меня .

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