这个问题的一些背景......
我正在读取数据库中的函数名称,然后使用c#Reflection来调用它们。但是我想要的是能够从字符串中获取UnityAction。
这就是我想要完成的......
UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(UnityEvent, UnityAction);
我所知道UnityAction是一名代表,但我不知道如何才能完成从字符串到UnityAction ...
我有什么......
UnityAction actionTemp;
UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(quest.questTrigger, actionTemp = new UnityAction(() => Q_UtilityManager.GetFunctionName<Q_OnTrigger>(str)));
GetFunctionName()是......
public static MethodInfo GetFunctionName<T>(string _func)
{
Type thisType = typeof(T);
MethodInfo theMethod = thisType.GetMethod(_func);
return theMethod;
}
这会导致相当大的错误归结为...
Could not register callback
任何帮助都会很棒。
答案 0 :(得分:2)
是否可以将函数名称的字符串转换为UnityAction?
是即可。您可以使用Delegate.CreateDelegate
功能执行此操作。您传入委托的类型UnityAction
,目标脚本实例(可以是this
或任何脚本实例,最后是要调用的函数名称。
这是一个将字符串函数名称转换为UnityAction
的简单函数:
UnityAction stringFunctionToUnityAction(object target, string functionName)
{
UnityAction action = (UnityAction)Delegate.CreateDelegate(typeof(UnityAction), target, functionName);
return action;
}
用法:
private UnityAction unityAction;
void Start()
{
unityAction = stringFunctionToUnityAction(this, "hello");
unityAction.Invoke();
}
//Function to call
void hello()
{
Debug.Log("Hello");
}
答案 1 :(得分:1)
您拥有MethodInfo
所以现在您只需要从中创建一个委托,为此您可以使用CreateDelegate方法。
在此示例中,我使用的是Action
而不是UnityAction
,因为我没有Unity引用。但是,将类型更改为UnityAction
或任何其他委托将是相同的。
在这个例子中,我将方法名称硬编码为Do
,但是如果你要从db获取它,它也会有效。然后我使用反射从它创建Action
。
public class Program
{
static void Main(string[] args)
{
var actionNameFromDb = "Do"; // Get it from db or wherever
var callback = (Action)GetFunctionName<Program>(actionNameFromDb).CreateDelegate(typeof(Action));
Action handler = callback;
callback();
Console.Read();
}
public static void Do()
{
Console.Write("Do was called.");
}
public static MethodInfo GetFunctionName<T>(string _func)
{
Type thisType = typeof(T);
MethodInfo theMethod = thisType.GetMethod(_func);
return theMethod;
}
}