C# Language dinamico


Esempio

La parola chiave dynamic viene utilizzata con oggetti digitati dinamicamente . Gli oggetti dichiarati come dynamic escludono i controlli statici in fase di compilazione e vengono invece valutati in fase di runtime.

using System;
using System.Dynamic;

dynamic info = new ExpandoObject();
info.Id = 123;
info.Another = 456;

Console.WriteLine(info.Another);
// 456

Console.WriteLine(info.DoesntExist);
// Throws RuntimeBinderException

L'esempio seguente utilizza la dynamic con la libreria di Newtonsoft Json.NET, per leggere facilmente i dati da un file JSON deserializzato.

try
{
    string json = @"{ x : 10, y : ""ho""}";
    dynamic deserializedJson = JsonConvert.DeserializeObject(json);
    int x = deserializedJson.x;
    string y = deserializedJson.y;
    // int z = deserializedJson.z; // throws RuntimeBinderException
}
catch (RuntimeBinderException e)
{
    // This exception is thrown when a property
    // that wasn't assigned to a dynamic variable is used
}

Esistono alcune limitazioni associate alla parola chiave dinamica. Uno di questi è l'uso di metodi di estensione. Nell'esempio seguente viene aggiunto un metodo di estensione per la stringa: SayHello .

static class StringExtensions
{
    public static string SayHello(this string s) => $"Hello {s}!";
}

Il primo approccio sarà chiamarlo come al solito (come per una stringa):

var person = "Person";
Console.WriteLine(person.SayHello());

dynamic manager = "Manager";
Console.WriteLine(manager.SayHello()); // RuntimeBinderException

Nessun errore di compilazione, ma a runtime si ottiene una RuntimeBinderException . La soluzione per questo sarà chiamare il metodo di estensione tramite la classe statica:

var helloManager = StringExtensions.SayHello(manager);
Console.WriteLine(helloManager);