C# 将lambda或方法组转换为操作<;T>;其中T仅在运行时已知

C# 将lambda或方法组转换为操作<;T>;其中T仅在运行时已知,c#,generics,types,lambda,type-conversion,C#,Generics,Types,Lambda,Type Conversion,我正在从运行时传递给我的字符串动态创建一个类型 我目前有以下代码: string messageType = "CustomerCreatedMessage"; //Convert the string to a Type var type = Type.GetType(messageType); //Create a Type of Action<CustomerCreatedMessage> var action = typeof(Action<>).MakeGene

我正在从运行时传递给我的字符串动态创建一个类型

我目前有以下代码:

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);
我的目标是能够调用我的通用方法
Messenger.Default。使用
操作注册
,该操作将从我的
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);
}

基本上,您不能在这里使用lambda表达式,因为您没有特定的委托类型将其转换为。

请检查,您真的不关心参数吗?一点也不关心,它只是在消息传入时触发代码。确实如此!我还有一个问题,GenericSetActive必须是静态的吗?SetActive需要在当前实例上运行,但当我将GenericSetActive更改为非静态委托时。CreateDelegate会抱怨:ArgumentException:方法参数长度不匹配,尽管我根本没有更改参数。我检查了,它正确地获取了GenericSetActive方法。非常感谢你的帮助!
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);