Sotto quali scenari di sviluppo di applicazioni C # dynamics ed ExpandoObject possono essere usati o quando considerare l'uso di c # dynamics e ExpandoObject
Uno scenario in cui ho visto efficacemente la dinamica utilizzata nell'implementazione dei commutatori di funzionalità .
Avevamo una classe FeatureToggles
accessibile globalmente che era un oggetto dinamico, quindi nel nostro codice potremmo rendere certe funzionalità del codice dipendenti dal comando abilitato, ad esempio:
public void DoSomething()
{
if (FeatureToggles.SomeFeatureEnabled)
{
DoSomeFeature();
}
}
I commutatori di funzionalità sono stati configurati nel file di configurazione dell'applicazione e l'oggetto FeatureToggles
dinamico ha letto la configurazione dell'app all'avvio. Se una funzione toggle è stata abilitata nella configurazione, la classe FeatureToggles
restituirebbe true; se una funzione non è abilitata, o non era ancora nel file di configurazione , la classe FeatureToggles
restituirebbe false. Fondamentalmente, questo ci ha permesso di iniziare a utilizzare i commutatori di funzionalità prima ancora che fossero stati configurati *, nel qual caso per impostazione predefinita disattivati.
* naturalmente c'era l'uscita di registrazione in questo caso.
Un caso limite in cui dynamic
non è necessario, ma può rendere il tuo codice più DRY e in realtà non meno sicuro per tipo quando implementa modello visitatore .
Il modo classico per implementare questo è avere un metodo Accept(Visitor visitor)
su ogni tipo derivato e devi implementarlo con lo stesso visitor.Visit(this)
boilerplate.
E questo presuppone che i tipi in questione supportino il visitatore. In caso contrario, hai bisogno di una grande if (obj is DerivedType1) … else if (obj is DerivedType2) … else if …
e la modifica ogni volta che viene aggiunto un nuovo tipo (insieme all'aggiunta del sovraccarico di Visit()
per il nuovo tipo).
Con dynamic
, è una questione di linea singola per lanciare il tuo tipo su dynamic
, il che significa che verrà scelto il sovraccarico corretto:
public void Visit(BaseType obj)
{
VisitInternal((dynamic)obj);
}
protected virtual void VisitInternal(DerivedType1 obj)
{
}
protected virtual void VisitInternal(DerivedType2 obj)
{
}
// etc.
Questa potrebbe essere la mia opinione personale ma: Mai
Stai usando C #. Linguaggio tipizzato statico. E probabilmente uno dei motivi per cui lo stai usando è perché ti piace la sicurezza della digitazione statica per vari motivi. Se volessi sacrificarlo, useresti un linguaggio dinamico reale come Python o Ruby.
Leggi altre domande sui tag c# programming-practices architecture object-oriented-design