Dinamica C # e oggetto Expando [chiuso]

1

Sotto quali scenari di sviluppo di applicazioni C # dynamics ed ExpandoObject possono essere usati o quando considerare l'uso di c # dynamics e ExpandoObject

    
posta Chief 15.02.2013 - 05:15
fonte

3 risposte

3

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.

    
risposta data 15.02.2013 - 11:08
fonte
3

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.
    
risposta data 15.02.2013 - 12:06
fonte
-1

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.

    
risposta data 15.02.2013 - 07:58
fonte