将lambda或方法组转换为Action< >其中T只在运行时已知
本文关键字:其中 运行时 方法 lambda 转换 Action | 更新日期: 2023-09-27 18:01:15
我正在动态地从运行时传递给我的字符串创建类型。
我现在有下面的代码:
string messageType = "CustomerCreatedMessage";
//Convert the string to a Type
var type = Type.GetType(messageType);
//Create a Type of Action<CustomerCreatedMessage>
var action = typeof(Action<>).MakeGenericType(messageType);
我如何创建一个类型为action
的变量并将m=> SetActive(true)
赋值给它?然后,我将在以下代码中使用变量(此处名为???
):
//Create a generic method "Register" on my Messenger class that takes an Action<CustomerCreatedMessage> parameter.
var method = typeof(Messenger).GetMethod("Register");
var genericMethod = method.MakeGenericMethod(action);
//Invoke the created method with our script in it
genericMethod.Invoke(Messenger.Default, ???);
我的目标是能够调用我的泛型方法Messenger.Default.Register<>
与Action<>
,作为类型参数从我的messageType
字符串创建的类型。
我已经试过了:
Convert.ChangeType(m=>SetActive(true),action);
var filledAction = Activator.CreateInstance(action);
filledAction = m=>SetActive(true);
但是这两种方法都抱怨将lambda表达式转换为对象,因为它不是委托。
如果我将SetActive(true)
放入方法并尝试传递方法组,我会得到类似的错误。
假设您根本没有使用该参数,我将创建一个新的泛型方法:
private static void GenericSetActive<T>(T ignored)
{
SetActive(true);
}
然后创建一个委托,使用:
var genericMethod = typeof(Foo).GetMethod("GenericSetActive",
BindingFlags.NonPublic |
BindingFlags.Static);
var concreteMethod = genericMethod.MakeGenericMethod(type);
var actionInstance = Delegate.CreateDelegate(action, concreteMethod);
基本上,你不能在这里使用lambda表达式因为你没有一个特定的委托类型来转换它