2010-03-13 6 views
3

L'exemple fictif ici. Supposons que j'ai créé une classe nommée IODevice. Cette classe implémente déjà une structure qui me permet de l'utiliser de la manière suivante:Comment créer une propriété dynamique significative?

 IODevice dio = new IODevice(); 

     try 
     { 
      dio.Pin["IsBirdInCageSensor"].Set(); 
      dio.Pin["KillBird"].Get(); 
      //dio.Pin["NonExistant"].Set(); //exception 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

Pins ici sont une série de lignes d'entrées-sorties dans une boîte IO numérique qui peut aller haut (1) ou faible (0).

Je voudrais utiliser dynamique pour appeler de la manière suivante:

 dio.Pins.KillBird.Get(); 

Ma classe IO Device ressemble à ce moment, et comme vous le constaterez, je n'ai pas beaucoup avancé sur la façon de implémenter l'interface dynamique, à l'exception de l'utilisation du mot clé dynamique. La deuxième question est: quels sont les inconvénients de l'utilisation d'un tel design? (en dehors de l'absence de vérification de type difficile - que je n'ai pas de toute façon)

Répondre

2

Si vous souhaitez continuer à utiliser votre type PinCollection existant, PinCollection doit implémenter IDynamicMetaObjectProvider. Alors Pins retournerait la même PinCollection que Pin, mais parce qu'il a été tapé comme dynamique permettrait la syntaxe obj.Pins.KillBird (et votre implémentation GetMetaObject traduirait cela dans les accès de dictionnaire sur PinCollection).

Si vous pouvez modifier votre implémentation, vous pouvez utiliser à la place ExpandoObject classe:

private ExpandoObject _pins; 
public dynamic Pins { get { return _pins; } } 

ExpandoObject est essentiellement un dictionnaire qui a déjà une métaobjets qui se traduit par la propriété dynamique des accès dans le dictionnaire accès. Notez que dans ce cas, vous devrez vous débarrasser de la PinCollection typée, ou trouver un moyen de synchroniser les deux: vous ne voulez pas que des données de pins différentes soient stockées aux deux endroits.

+0

@itowlson: Bonne suggestion, et +1 pour mentionner ExpandoObject. @Padu: Checkout l'exemple C# ici [http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (VS.100) .aspx], pourrait aider. –

+0

@KMan: le lien ne fonctionne pas ici –

+0

Padu: il y a un étranger] à la fin du lien de KMan. Efface juste ça. Mais je pense qu'il va au même endroit que le lien ExpandoObject dans le corps de la réponse. – itowlson

Questions connexes