【问题标题】:Converting lambda or method group to Action<T> where T is only known at runtime将 lambda 或方法组转换为 Action<T>,其中 T 仅在运行时已知
【发布时间】:2014-06-17 06:36:06
【问题描述】:

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

我现在有以下代码:

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 类型的变量并将lambda m=&gt; 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, ???);

我的目标是能够使用Action&lt;&gt; 调用我的泛型方法Messenger.Default.Register&lt;&gt;,该方法将使用我的messageType 字符串创建的类型作为类型参数。

我已经尝试过以下方法:

Convert.ChangeType(m=>SetActive(true),action);

var filledAction = Activator.CreateInstance(action);
filledAction = m=>SetActive(true);

但是这两种方法都抱怨将 lambda 表达式转换为对象,因为它不是委托。

如果我将SetActive(true) 放入方法中并尝试传递方法组,我会收到类似的错误。

【问题讨论】:

  • 只是检查一下,你真的不关心参数吗?
  • 根本没有,只是在消息进来的时候触发代码。

标签: c# generics types lambda type-conversion


【解决方案1】:

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

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 表达式,因为您没有特定的委托类型可将其转换为。

【讨论】:

  • 当然可以!我还有另一个问题,GenericSetActive 必须是静态的吗? SetActive 需要在当前实例上运行,但是当我将 GenericSetActive 更改为非静态 Delegate.CreateDelegate 时会抱怨:ArgumentException: 方法参数长度不匹配,尽管我根本没有更改参数。我检查了一下,它正确地获取了 GenericSetActive 方法。
  • 从头开始,刚刚注意到重载 Delegate.CreateDelegate(action, object, concreteMethod)。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2021-05-06
  • 2016-04-14
相关资源
最近更新 更多