У меня есть следующий код:
class Program
{
static void Main(string[] args)
{
new Program().Run();
}
public void Run()
{
// works
Func<IEnumerable<int>> static_delegate = new Func<IEnumerable<int>>(SomeMethod<String>);
MethodInfo mi = this.GetType().GetMethod("SomeMethod").MakeGenericMethod(new Type[] { typeof(String) });
// throws ArgumentException: Error binding to target method
Func<IEnumerable<int>> reflection_delgate = (Func<IEnumerable<int>>)Delegate.CreateDelegate(typeof(Func<IEnumerable<int>>), mi);
}
public IEnumerable<int> SomeMethod<T>()
{
return new int[0];
}
}
Почему я не могу создать делегата в своем общем методе? Я знаю, что мог просто использовать mi.Invoke(this, null)
, но так как я собираюсь хотеть выполниться SomeMethod
потенциально несколько миллионов раз, я хотел бы смочь создать делегата и кэшировать его как маленькую оптимизацию.
Ваш метод не является статическим методом, поэтому вам необходимо использовать:
Func<IEnumerable<int>> reflection_delgate = (Func<IEnumerable<int>>)Delegate.CreateDelegate(typeof(Func<IEnumerable<int>>), this, mi);
Передача «this» второму аргументу позволит привязать метод к методу экземпляра текущего объекта ...