4 votes

Est-ce une façon raisonnable d'utiliser C# dynamic ?

Pardonnez cet exemple grossier. J'ai un encodeur qui renvoie une interface. Au lieu d'utiliser "is" et "as" pour obtenir l'objet qui implémente l'interface, j'aimerais utiliser la dynamique pour accéder à un objet de type champ de l'objet. Le site champ n'est PAS dans l'interface, mais est commune à tous les objets qui implémentent l'interface.

EDIT : Je dois également mentionner que je n'ai pas le contrôle de l'encodeur ou de ses interfaces et que je ne peux donc pas les modifier.

public class Program
{
  public Program()
  {
    dynamic temp = GetInterface();
    string s = temp.Blah;
    temp.Blah = s;
  }

  private ITest GetInterface()
  {
    return new Test();
  }
}
public interface ITest
{
}
public class Test : ITest
{
  public string Blah { get; set; }
}

4voto

Kieren Johnstone Points 19499

Ce n'est pas un très bon exemple. Si toutes (ou beaucoup) d'implémentations de l'interface ont le champ, alors créez une implémentation abstraite de l'interface avec le champ, faites en sorte que les implémentations dérivent de la classe abstraite au lieu d'hériter de l'interface. Vous pouvez alors utiliser la classe abstraite plutôt que l'interface.

3voto

JaredPar Points 333733

L'utilisation fonctionnera très bien. Le site dynamic La liaison examinera le type et trouvera la propriété sous-jacente. De ce point de vue, il est valide.

Cependant, si c'est une propriété commune à toutes les implémentations de l'interface, pourquoi ne pas l'ajouter à l'interface ? S'il s'agit d'une propriété que vous préférez ne pas rendre publique, pourquoi ne pas avoir une deuxième interface interne qui contient cette propriété ?

1voto

Jeb Points 1749

Oui, c'est acceptable et cela compile. Cependant, de mon point de vue, cela ressemble à un anti-modèle. Que se passe-t-il si vous renommez un jour la propriété Blah dans la classe ? Bien sûr, ça compilera mais...

Note : d'après votre édition, je comprends que vous ne pouvez pas ajouter la propriété à ITest. Je créerais donc une nouvelle interface "ITest2" avec la propriété que Test implémente, et je laisserais le compilateur faire le travail pour vous.

0voto

Daniel Mann Points 9146

Dans le cas spécifique que vous avez mentionné, il semble que la propriété devrait être membre de l'interface.

0voto

Daniel Earwicker Points 63298

Pourquoi ne pas ajouter Blah a ITest ? C'est-à-dire :

public interface ITest
{
    public string Blah { get; set; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X