2 votes

Pourquoi est-ce que j'obtiens cette erreur 'binding to target method' en utilisant Delegate.CreateDelegate ?

La méthode Run2 est exécutée. Mais la méthode Run n'est pas exécutée. Quelle en est la raison ? La seule différence entre les deux méthodes est parce que le paramètre.

public class MyClass
{
    public string Name { get; set; }
}

[TestFixture]
public class Test
{
    public IEnumerable<T> TestMethod<T>(int i)
    {
        //do something
        return null;
    }

    public IEnumerable<T> TestMethod2<T>()
    {
        //do something
        return null;
    }

    [Test]
    public void Run()
    {
        MethodInfo mi = this.GetType().GetMethod("TestMethod").MakeGenericMethod(typeof(MyClass));
        var del = Delegate.CreateDelegate(typeof(Func<IEnumerable<MyClass>>), this, mi);
        var list = (IEnumerable<MyClass>)del.DynamicInvoke(0);
    }

    [Test]
    public void Run2()
    {
        MethodInfo mi = this.GetType().GetMethod("TestMethod2").MakeGenericMethod(typeof(MyClass));
        var del = Delegate.CreateDelegate(typeof(Func<IEnumerable<MyClass>>), this, mi);
        var list = (IEnumerable<MyClass>)del.DynamicInvoke();
    }
}

3voto

Reed Copsey Points 315315

Le problème est là :

var del = Delegate.CreateDelegate(typeof(Func<IEnumerable<MyClass>>), this, mi);

Vous avez dit de lier votre méthode à un fichier Func<IEnumerable<MyClass>> mais la méthode réelle doit être Func<int, IEnumerable<MyClass>> (en raison de la int argument pour TestMethod ). Le texte suivant devrait le corriger :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X