将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)放入方法并尝试传递方法组,我会得到类似的错误。

将lambda或方法组转换为Action< >其中T只在运行时已知

假设您根本没有使用该参数,我将创建一个新的泛型方法:

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表达式因为你没有一个特定的委托类型来转换它