2010-03-10 21 views
12

tengo el siguiente código:Crear delegado genérico utilizando la reflexión

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]; 
    } 
} 

Por qué no puedo crear un delegado a mi método genérico? Sé que podría usar mi.Invoke(this, null), pero dado que voy a querer ejecutar SomeMethod potencialmente varios millones de veces, me gustaría poder crear un delegado y almacenarlo en caché como una pequeña optimización.

Respuesta

8

método no es un método estático, por lo que es necesario utilizar:

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

Pasando "este" al segundo argumento permitirá que el método que se va ligado al método de instancia en el objeto actual. ..

+0

Doh! Muchas gracias, no sé cómo me lo perdí. – Dathan

Cuestiones relacionadas