【问题标题】:Create a delegate when the exact type of the argument is unknown当参数的确切类型未知时创建委托
【发布时间】:2016-02-06 07:32:32
【问题描述】:

我在为这个实例方法创建正确的委托时遇到了一些麻烦:

public T AddComponent<T>() where T : Component
{
      ....
}

我正在使用反射来获取特定的 MethodInfo,并且在 Delegate.CreateDelegate 上我收到了与目标方法绑定的错误

private delegate T AddComponent<out T>();
private static AddComponent<Component> AddC { get; set; }
public void Test() 
{
  var go = new GameObject();
  var targetAddComponent =
    typeof (GameObject).GetMethods().First(m => m.Name == "AddComponent" && m.GetParameters().Length == 0);      
  AddC = (AddComponent<Component>) Delegate.CreateDelegate(typeof (AddComponent<Component>), go, targetAddComponent, true);
  ....
}

你对我做错了什么有任何线索吗?

【问题讨论】:

  • 您将方法和委托命名为同一个东西,这令人难以置信。

标签: c# generics delegates covariance


【解决方案1】:

方法信息是方法GameObject.AddComponent&lt;T&gt; 的方法信息,它返回T。委托,你难以置信地混淆地命名为与方法相同,必须是返回Component 的方法。你做了什么使 T 等于 Component?什么都没有。

换一种说法:方法信息是一种方法信息,它在构造之前实际上不是可调用的方法。这是制作方法的通用模式,而不是方法。如果你想委托它,让它成为一个方法。您需要在方法中为类型参数 T 提供类型参数。

【讨论】:

  • var targetAddComponent = typeof (GameObject).GetMethods().First(m => m.Name == "AddComponent" && m.GetParameters().Length == 0).MakeGenericMethod(typeof(组件));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多