- Home /
MethodInfo.Invoke() throwing ArgumentException: failed to convert parameters
Hello, I am creating an editor script in which the user should be able to select a script file he wrote, and a function from this script should be invoked sometime during the game.
I have a class which stores a MethodInfo field, and this is the function I am trying to invoke.
Now, if the function receives only a float for example it works, so this line works:
propertyData.transformationFunc.Get().Invoke(propertyData.transformationObj.Get(), new object[] { param });
small explanation - transformationFunc.Get() gives me a MethodInfo, transformationObj.Get() gives me an instance of the class which holds the function I am invoking and param is a float.
Although, what I really want to pass in this function right now is a float and ALSO a Vector3 value. So if I change the function to receive a Vector3 in addition to the float and I try invoking like this:
propertyData.transformationFunc.Get().Invoke(propertyData.transformationObj.Get(), new object[] { param , propertyData.property.Get() });
it doesn't work and throws the exception stated in the title of this question.
small explanation - propertyData.property.Get() in this case returns UnityEngine.Vector3, so it should be compatible with a function which receives a float and a Vector3.
Thanks all.
Answer by hoekkii · Aug 09, 2017 at 02:30 PM
Reflection does not care about function overloading. Instead use Type::GetMethods : MethodInfo[]
instead and make a function like this:
public static void SafeInvoke(this MethodInfo[] methods, object target, params object[] args)
{
foreach (var method in methods)
{
var parameters = method.GetParameters();
if (args.Length != parameters.Length)
continue;
// Check if a type does not match
if (parameters.Where((t, i) => args[i].GetType() != t.ParameterType).Any())
continue;
method.Invoke(target, args);
return;
}
throw new ArgumentException();
}
Note: This is not tested
Edit: Alternatively you get use Type::GetMethod("MyMethodName", new [] {typeof(MyType),})
Your answer
Follow this Question
Related Questions
SceneView.onSceneGUIDelegate GUI sorting problem 1 Answer
Populating object fields in a loop - editor scripting 1 Answer
Retrieve default editor field / conditional hide field, 0 Answers
Play Unity Editor from VSCode? 0 Answers
Is there a way to get all editable fields of a component in a script? 2 Answers