Создать универсальный делегат, используя отражение - PullRequest
12 голосов
/ 10 марта 2010

У меня есть следующий код:

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 потенциально несколько миллионов раз, я хотел бы иметь возможность создать делегат и кэшировать его как небольшую оптимизацию.

1 Ответ

8 голосов
/ 10 марта 2010

Ваш метод не является статическим, поэтому вам нужно использовать:

Func<IEnumerable<int>> reflection_delgate = (Func<IEnumerable<int>>)Delegate.CreateDelegate(typeof(Func<IEnumerable<int>>), this, mi);

Передача this в этот второй аргумент позволит привязать метод к методу экземпляра текущего объекта ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...