我想通过字符串调用方法。直到我的代码返回parameter count mismatch
,我走了很远。
我知道我的classInstance
和method
都不null
. 我读到您需要将参数数组放入另一个数组中。
它看起来很完美,但它给了我这个错误。 该方法的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
如果某些东西失败了。 该方法只有一个参数(字符串(。在这种情况下,用户 ID 作为参数进入方法。
它不会返回任何内容,而是在返回某些内容之前检测到错误。 错误来自method.Invoke(classInstance, new object[] { parametersArray });
。
我在Reflection上用谷歌搜索了parameter count mismatch
,但我看到的所有解决方案仍然给出相同的错误。 我能做的最好吗?
罪恶 没有提供很多有用的信息,你最好的选择是做这样的事情来修复参数,你的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;
}