#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 Я добавил примеры вызова обоих методов; если вы не можете заставить свою версию работать, пожалуйста, опубликуйте минимальное повторение, аналогичное тому, что у меня выше, которое показывает, что вы видите. Трудно отлаживать код, который существует только на чужом компьютере.