方法调用返回 'parameter count mismatch' 作为错误
Method invoke is returning 'parameter count mismatch' as error
我想通过字符串调用一个方法。在我的代码 returns parameter count mismatch
之前,我已经走得很远了。
我知道我的 classInstance
和 method
都不是 null
。
我读到你需要将你的参数数组放入另一个数组中。
它看起来很完美,但它给了我这个错误。
该方法的 class
位于 Modules.Achievements.Achieve
。
methodname
是与 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;
}
我想通过字符串调用一个方法。在我的代码 returns parameter count mismatch
之前,我已经走得很远了。
我知道我的 classInstance
和 method
都不是 null
。
我读到你需要将你的参数数组放入另一个数组中。
它看起来很完美,但它给了我这个错误。
该方法的 class
位于 Modules.Achievements.Achieve
。
methodname
是与 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;
}