2009-08-25 5 views
2

Je me demande s'il est possible (et quelle serait la syntaxe) d'envoyer la méthode d'un objet à une fonction.Est-il possible d'envoyer une méthode d'objet à une fonction?

Exemple:

Object "myObject" has two methods "method1" and "method2" 

Je voudrais avoir une fonction le long des lignes de:

public bool myFunc(var methodOnObject) 
{ 
    [code here] 
    var returnVal = [run methodOnObject here] 
    [code here] 
    return returnVal; 
} 

Alors que dans une autre fonction que je pouvais faire quelque chose comme

public void overallFunction() 
{ 
    var myObject = new ObjectItem(); 
    var method1Success = myFunc(myObject.method1); 
    var method2Success = myFunc(myObject.method2); 
} 
+2

Biographie des délégués devrait résoudre votre problème –

Répondre

3

Existe-t-il vraiment un besoin de délégués explicites? Peut-être que cette approche pourrait vous aider:

private class MyObject 
{ 
    public bool Method1() { return true; } // Your own logic here 
    public bool Method2() { return false; } // Your own logic here 
} 

private static bool MyFunction(Func<bool> methodOnObject) 
{ 
    bool returnValue = methodOnObject(); 
    return returnValue; 
}  

private static void OverallFunction() 
{ 
    MyObject myObject = new MyObject(); 

    bool method1Success = MyFunction(myObject.Method1); 
    bool method2Success = MyFunction(myObject.Method2); 
} 
+2

Je ne sais pas si c'est une faute de frappe ... 'Func <...>' very much ** is ** a 'delegate'. –

+0

Désolé de supprimer mon commentaire, il s'agissait de "Y at-il vraiment besoin de délégués?" et en faisant un exemple avec Func qui est un délégué ... –

+0

C'est génial, merci. J'ai accepté ceci comme la réponse car elle a utilisé mon exemple directement. – ChrisHDog

2

Oui , en utilisant les délégués.

Voici un exemple ..

delegate string myDel(int s); 
public class Program 
{ 
    static string Func(myDel f) 
    { 
     return f(2); 
    } 

    public static void Main() 
    { 
     Test obj = new Test(); 
     myDel d = obj.func; 
     Console.WriteLine(Func(d)); 
    } 
} 
class Test 
{ 
    public string func(int s) 
    { 
     return s.ToString(); 
    } 
} 
+0

Fournir un exemple va probablement vous donner un certain up-voix ... –

8

Oui, vous devez utiliser un délégué. Les délégués sont assez analogues aux pointeurs de fonction en C/C++.

Vous devez d'abord déclarer la signature du délégué. Dire que j'ai cette fonction:

private int DoSomething(string data) 
{ 
    return -1; 
} 

La déclaration de délégué serait ...

public delegate int MyDelegate(string data); 

Vous pouvez ensuite déclarer myFunc de cette façon ..

public bool myFunc(MyDelegate methodOnObject) 
{ 
    [code here] 
    int returnValue = methodOnObject("foo"); 
    [code here] 
    return returnValue; 
} 

Vous pouvez alors l'appeler de l'une des deux manières suivantes:

myFunc(new MyDelegate(DoSomething)); 

Ou, en C# 3.0 et versions ultérieures, vous pouvez utiliser le raccourci de ...

myFunc(DoSomething); 

(Il enveloppe juste la fonction fournie dans le constructeur par défaut pour ce délégué automatiquement. Les appels sont fonctionnellement identiques).

Si vous ne se soucient pas de créer effectivement un délégué ou la mise en œuvre de la fonction réelle des expressions simples, ce qui suit travaillera en C# 3.0 ainsi:

public bool myFunc(Func<string, int> expr) 
{ 
    [code here] 
    int returnValue = methodOnObject("foo"); 
    [code here] 
    return returnValue; 
} 

Ce qui pourrait alors être appelé comme ceci:

myFunc(s => return -1); 
+1

C# 3.5 vous permet également d'éviter de déclarer votre propre type de délégué, que vous pouvez faites 'Func ' qui représente la même signature que votre type 'MyDelegate'. –

+1

@Simon: Dans certains cas, oui, il existe des types de délégués intégrés, et 3.5 en a ajouté plusieurs potentiellement utiles dans le cadre du package de support LINQ. Cela étant dit, être capable de déclarer un délégué est quelque chose que tout développeur .NET devrait être capable de faire. –

+0

Bonne réponse, merci pour toutes les informations et les détails.Voté, mais utilisé autre comme réponse officielle car il a directement utilisé mon exemple. Parfois, souhaiter qu'il pourrait y avoir 2 réponses acceptées car combinées vos deux réponses donnent tous les détails que n'importe qui pourrait vouloir pour cette question. Merci encore! – ChrisHDog

Questions connexes