方法调用返回 'parameter count mismatch' 作为错误

Method invoke is returning 'parameter count mismatch' as error

我想通过字符串调用一个方法。在我的代码 returns parameter count mismatch 之前,我已经走得很远了。

我知道我的 classInstancemethod 都不是 null。 我读到你需要将你的参数数组放入另一个数组中。

它看起来很完美,但它给了我这个错误。 该方法的 class 位于 Modules.Achievements.Achievemethodname 是与 Achieve class.

中的现有方法相等的变量字符串
    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;

我的方法应该 return 一个 Boolean 无论是否失败。 该方法只有一个参数(字符串)。在这种情况下,它是作为参数进入方法的用户标识。

它不是 returning 任何东西,而是在 returning 某些东西之前检测到错误。 错误来自 method.Invoke(classInstance, new object[] { parametersArray });.

我用谷歌搜索 parameter count mismatch 关于 Reflection,但我看到的所有解决方案仍然给出相同的错误。 我最擅长什么?

Sins 没有提供很多有用的信息,你最好的选择是做这样的事情来修复参数,而且你的 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;
}