2010-11-15 2 views
1

Dire que j'ai 2 classes, classe A et classe B. Classe A crée une instance de classe B. Classe A a une fonction que je voudrais passer dans une méthode de la classe B.Puis-je utiliser la fonction d'une autre classe en tant que délégué?

class A { 
    void Main(string[] args) { 
    B classB=new B(); 

    DelegateCaller(new delFunction(classB.TheFunction()); // <-- Won't compile (method name expected) 
    DelegateCaller(new delFunction(B.TheFunction());  // <-- Won't compile (object reference is req'd) 
    } 

    public delegate string delFunction(); 

    public DelegateCaller(delFunction func) { 
    System.Console.WriteLine(func()); 
    } 
} 

class B { 
    public string TheFunction() { 
    return "I'm Printing!!!"; 
    } 
} 

Je Je ne sais pas si c'est un problème de syntaxe ou c'est juste quelque chose que je ne peux pas faire. Peut-être que je dois définir le délégué dans B, mais le référencer dans A? Qu'en est-il de de B ce pointeur?

Répondre

6

C'est juste un problème de syntaxe; se débarrasser des parenthèses après classB.TheFunction - ils indiquent que vous souhaitez invoquer la méthode.

DelegateCaller(new delFunction(classB.TheFunction)); 

Prenez note qu'il ya une conversion implicite disponible à partir d'une méthode groupe, vous pouvez juste faire:

DelegateCaller(classB.TheFunction); 

Notez également que la création de votre propre type délégué dans ce cas est inutile; vous pouvez simplement utiliser le type Func<string> intégré.

EDIT: Comme le souligne Darin Dimitrov, il existe également un problème sans rapport avec l'appel d'une méthode d'instance comme s'il s'agissait d'une méthode statique.

+0

son code est loin de compiler même avec ceci. Voir ma réponse pourquoi. –

+0

Si je pouvais vous donner à la fois Darin et vous, mais comme vous étiez le premier et que vous avez un rep inférieur, vous l'obtenez. –

3

Essayez comme ceci:

class A 
{ 
    static void Main() 
    { 
     B classB = new B(); 
     DelegateCaller(classB.TheFunction); 
    } 

    public delegate string delFunction(); 

    public static void DelegateCaller(delFunction func) 
    { 
     Console.WriteLine(func()); 
    } 
} 

class B 
{ 
    public string TheFunction() 
    { 
     return "I'm Printing!!!"; 
    } 
} 

Laissez-moi élaborer sur les différents changements que j'ai apportées à votre code initial:

  1. TheFunction en classe B doit être public afin que vous puissiez accéder à Il appartient à la classe A
  2. La méthode DelegateCaller dans la classe A doit être statique et ne pas nécessairement renvoyer une valeur (la déclarer comme nulle) si vous souhaitez l'appeler à partir de la méthode statique Main.
  3. La définition du délégué delFunction doit renvoyer une chaîne.
+0

J'ai remarqué le public manquant après que j'ai posté (le vrai code est trop grand par exemple, je l'ai réduit).Même avec le statique manquant. L'utilisation réelle n'est pas à l'intérieur de Main. Merci! –

1

Décochez la parenthèse à la fin de TheFunction. Vous voulez la méthode, pas le résultat d'un appel à la méthode.

0
DelegateCaller(new delFunction(B.TheFunction()); 

devrait être

DelegateCaller(new delFunction(B.TheFunction); 

Pour utiliser classB.TheFunction vous devez faire theFunction statique. Vous passez dans la fonction sans parens.

1

Si vous souhaitez capturer une méthode d'instance pour une utilisation générale, vous devez utiliser Delegate.CreateDelegate(Type,MethodInfo). C'est bien car cela vous permet de créer un "délégué ouvert", ce qui signifie qu'il n'est pas lié à une instance et peut prendre n'importe quelle instance ClassB. Cela rend la réflexion assez rapide si vous connaissez les informations de type, car cette méthode fonctionnera beaucoup plus rapidement que l'instruction équivalente en utilisant MethodInfo.Invoke.

Questions connexes