C# Language Ricerca dinamica dei membri

Esempio

Una nuova dynamic pseudo-tipo viene introdotta nel sistema di tipo C #. Viene trattato come System.Object , ma in aggiunta, qualsiasi accesso membro (chiamata di metodo, campo, proprietà o accesso dell'indicizzatore o invocazione di un delegato) o applicazione di un operatore su un valore di tale tipo è consentito senza alcun tipo di controllo, e la sua risoluzione è posticipata fino al momento dell'esecuzione. Questo è noto come digitazione anatra o rilegatura tardiva. Per esempio:

// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
    return obj.Length;
}
  
GetLength("Hello, world");        // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42);                    // but not an integer - an exception will be thrown
                                  // in GetLength method at run-time

In questo caso, viene utilizzato il tipo dinamico per evitare riflessioni più dettagliate. Usa ancora Reflection sotto il cofano, ma di solito è più veloce grazie al caching.

Questa funzionalità è principalmente rivolta all'interoperabilità con linguaggi dinamici.

// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");

// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();

Il tipo dinamico ha applicazioni anche nel codice per lo più tipizzato staticamente, per esempio rende possibile la doppia spedizione senza implementare il pattern Visitor.