2008-12-01 7 views
1

Comment j'appelle la fonction surchargée correcte en référence à un objet basé sur le type réel de l'objet. Par exemple ...Comment appeler la fonction surchargée correcte lors de l'exécution?

class Test 
{ 
    object o1 = new object(); 
    object o2 = new string("ABCD"); 
    MyToString(o1); 
    MyToString(o2);//I want this to call the second overloaded function 


    void MyToString(object o) 
    { 
     Console.WriteLine("MyToString(object) called."); 
    } 

    void MyToString(string str) 
    { 
     Console.WriteLine("MyToString(string) called."); 
    } 
} 

Qu'est-ce que je veux dire est-il une meilleure option que ce qui suit?

if(typeof(o) == typeof(string)) 
{ 
    MyToString((string)o); 
} 
else 
{ 
    MyToString(o); 
} 

Peut-être cela peut-il être fait en utilisant la réflexion? Fonction

Répondre

3

Ok dès que je frappe après je me suis rappelé cela peut en effet être fait en utilisant la réflexion ...

var methInfo = typeof(Test).GetMethod("MyToString", new Type[] {o.GetType()}); 
methInfo.Invoke(this, new object[] {o}); 
0

Pourquoi ne pas avoir un toString() dans l'objet réel lui-même? De cette façon, vous pouvez appeler myObj.toString() et la sortie relative est donnée. Ensuite, vous n'avez pas à faire de comparaison.

+0

Ceci est juste un exemple montrant mon problème réel. –

1

Vous pouvez simplement utiliser les opérateurs ternaires à coder cela en utilisant une seule ligne propre code:

MyToString(o is string ? (string)o : o); 
+0

Est-ce que cela compile même? – leppie

+0

Et courir comme vous l'attendez? – leppie

+0

Je suis assez sûr que ce sera le cas. – mbillard

Questions connexes