Вызов метода возвращает «несоответствие количества параметров» как ошибку - PullRequest
0 голосов
/ 07 октября 2019

Я хочу вызвать метод по строке. Я прошел довольно далеко, пока мой код не вернул parameter count mismatch.

Я знаю, что ни мои classInstance, ни мои method не равны null. Я прочитал, что вам нужно поместить ваш Parameterarray в другой массив.

Кажется, это просто идеально, но тогда это дает мне эту ошибку. class метода расположен в Modules.Achievements.Achieve. methodname - это переменная строка, которая будет равна существующему методу в классе Achieve.

    string userid = Modules.Users.GetCreatorId();
    var type = typeof(Modules.Achievements.Achieve);
    MethodInfo method = type.GetMethod(methodname);
    try
    {
      if ( method == null )
        return;
      object classInstance = Activator.CreateInstance(type, null);
      if ( classInstance == null ) 
        return;
      object[] parametersArray = new object[] { userid };
      var result = (Boolean)method.Invoke(classInstance, 
                                          new object[] { parametersArray });
      if ( result )
      {
        Console.WriteLine("succeeded.");
        return;
      }
      Console.WriteLine("incorrect steamid.");
      return;
    }
    catch ( Exception e )
    {
      Console.WriteLine($"error:{e.Message}");
    }
    Console.WriteLine("failed.");
    return;

Мой метод должен вернуть Boolean, если что-то не удалось или нет. Метод имеет только один параметр (String). В этом случае это идентификатор пользователя, который входит в метод в качестве параметра.

Вместо того, чтобы что-либо возвращать, он обнаруживает ошибку, прежде чем что-то возвращать. Ошибка от method.Invoke(classInstance, new object[] { parametersArray });.

Я погуглил parameter count mismatch на Reflection, но все решения, которые я видел, все еще дают ту же ошибку. Что я могу сделать лучше всего?

1 Ответ

1 голос
/ 07 октября 2019

Грехов не предоставлено много полезной информации, лучше всего было бы сделать что-то подобное для исправления параметров, также следует передать ваш parametersArray, не являясь частью другого массива.

public void InvokeMethod()
{
    var type = typeof(Modules.Achievements.Achieve);

    var method = type.GetMethod(methodname);

    if (method != null)
    {
        var instance = Activator.CreateInstance(type, null);

        if (instance != null)
        {
            var fixedParams = ParseParameters(method.GetParameters(), new object[] { Modules.Users.GetCreatorId() });

            if ((bool)method.Invoke(instance, fixedParams))
            {
                Console.WriteLine("Success");                
            }
            else
            {
                Console.WriteLine("Invalid Steam ID");
            }
            return;
        }
    }
    Console.WriteLine("Encountered an error!");
}

private object[] ParseParameters(ParameterInfo[] methodParams, object[] userParams)
{
    int mLength = methodParams.Length;

    if (mLength > 0)
    {
        var objs = new object[mLength];

        if ((userParams == null) || (userParams.Length == 0))
        {
            for (int i = 0; i < mLength; i++)
            {
                var mp = methodParams[i];

                objs[i] = (mp.HasDefaultValue ? mp.DefaultValue : mp.ParameterType.IsClass ? null : Activator.CreateInstance(mp.ParameterType, null));
            }
        }
        else
        {
             int uLength = userParams.Length;

             if (uLength > mLength) { throw new ArgumentException("Too many params were specified"); }

             for (int i = 0; i < uLength; i++)
             {
                 objs[i] = Convert.ChangeType(userParams[i], methodParams[i].ParameterType);
             }

             if (uLength < mLength)
             {
                 for (int i = uLength; i < mLength; i++)
                 {
                     var mp = methodParams[i];

                     objs[i] = (mp.HasDefaultValue ? mp.DefaultValue : mp.ParameterType.IsClass ? null : Activator.CreateInstance(mp.ParameterType, null));
                 }
             }
        }
        return objs;
    }
    return null;
}
...