Создайте делегата, когда точный тип аргумента неизвестен

У меня есть некоторые проблемы с созданием правильного делегата для этого метода экземпляра:

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

Я использую отражение, чтобы получить конкретную информацию о методе, а в 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);
  ....
}

Есть ли у вас какие-либо подсказки о том, что я делаю неправильно?


person Luca Bottani    schedule 05.02.2016    source источник
comment
Это невероятно сбивает с толку, что вы назвали метод и делегат одним и тем же.   -  person Eric Lippert    schedule 06.02.2016


Ответы (1)


Информация о методе — это информация о методе GameObject.AddComponent<T>, который возвращает T. Делегат, который вы невероятно запутанно назвали так же, как и метод, должен относиться к методу, который возвращает Component. Что вы сделали, чтобы T равнялось Component? Ничего такого.

Иными словами: информация о методе — это информация о методе чего-то, что на самом деле не является вызываемым методом, пока не будет создано. Это общий шаблон для создания методов, а не метод. Сделайте это методом, если вы хотите сделать его делегатом. Вам необходимо предоставить аргумент типа для параметра типа T в методе.

person Eric Lippert    schedule 05.02.2016
comment
var targetAddComponent = typeof (GameObject).GetMethods().First(m =› m.Name == AddComponent && m.GetParameters().Length == 0).MakeGenericMethod(typeof(Component)); - person Luca Bottani; 06.02.2016