Vous devez comprendre que parce que C# est un langage typé statiquement (sauf dynamic
) la surcharge particulière qui est choisie (appelée résolution de surcharge) est déterminée au moment de la compilation , pas le temps d'exécution cela signifie que le compilateur doit être en mesure de déterminer avec certitude de quel type votre argument est Tenir compte:..
Object foo;
foo = "String";
foo = 5;
PrintInfo(foo); // Which overload of printinfo should be called? The compiler doesn't know!
Il y a quelques façons de résoudre this- faire foo
de type dynamic
est de un que provoquera la surcharge correcte à choisir au moment de la compilation. c'est-à-dire que vous perdez la sécurité du type - si vous ne disposez pas d'une surcharge appropriée pour ce type, votre application sera toujours compilée mais se bloquera lorsque vous essaierez d'imprimer les informations du type non supporté.
Une approche sans doute meilleure est de s'assurer que foo
est toujours du type correct, plutôt que seulement Object
.
Comme le suggère @Servy, une autre approche consiste à attacher le comportement au type lui-même. Vous pouvez, par exemple, faire une interface IHasPrintInfo
:
public interface IHasPrintInfo { String PrintInfo { get; } }
et mettre en œuvre cette interface sur tous les éléments dont les informations vous pouvez imprimer. Ensuite, votre fonction PrintInfo peut simplement prendre un IPrintInfo:
public void PrintInfo(IPrintInfo info) {
Console.WriteLine(info.PrintInfo);
}
Vous recherchez le modèle 'dynamic' ou le modèle de visiteur. – SLaks