Comment puis-je lancer l’object dynamicment?

Je suis à peu près sûr que cela a déjà été demandé, mais malheureusement, la seule chose que j’ai trouvée est que ce n’était pas une solution pour moi. Dans mon projet actuel, je fais quelque chose comme:

private object obj; private void Initialize() { obj.Initialize(); } private void CreateInstanceA() { obj = Activator.CreateInstance(typeof(MyClassA)); } private void CreateInstanceB() { obj = Activator.CreateInstance(typeof(MyClassB)); } 

Ce code ne fonctionne bien sûr pas car je n’ai pas jeté obj car son type change de façon dynamic.

Comment puis-je le lancer dynamicment?

Trois options:

  • Si vous contrôlez les deux classes et que vous pouvez leur faire implémenter une interface commune qui inclut tout ce dont vous avez besoin, faites-le – et transmettez-le à l’interface.
  • Si vous utilisez C # 4 et .NET 4, vous pouvez utiliser le typage dynamic – déclarez simplement la variable en tant private dynamic obj; et il va comstackr et trouver la bonne méthode au moment de l’exécution
  • Sinon, utilisez la reflection pour rechercher et appeler la méthode.

Fondamentalement, le casting basé sur un type de temps d’exécution n’a pas de sens, car une partie du casting consiste à donner plus d’informations au compilateur … et vous ne l’avez tout simplement pas dans ce cas.

La première option est de loin la plus agréable si vous pouvez éventuellement y parvenir.

Je suppose que CreatInstanceB () devrait réellement utiliser MyClassB, correct?

Dans ce cas, vous pouvez utiliser:

 ((MyClassA)obj).Initialize(); 

 ((MyClassB)obj).Initialize(); 

Ou vous pouvez créer une interface qui a une méthode Initialize et définir obj comme cette interface.