Maison >développement back-end >Tutoriel C#.Net >Programmation avancée C# Chapitre 12 Extension du langage dynamique

Programmation avancée C# Chapitre 12 Extension du langage dynamique

大家讲道理
大家讲道理original
2017-04-11 14:05:592314parcourir

(1) DLR

La fonction dynamique de C#4 est Dynamic Language Runtime(Dynamic Language Runtime, faisant partie de DLR). DLR est un ensemble de services ajoutés à CLR.

(2) type dynamique

dynamique type autorisé Écrivez du code qui ignore la vérification de type lors de la compilation. Le compilateur suppose que toute opération définie pour un objet de type dynamique est valide et le compilateur ne vérifiera pas les erreurs avant de l'exécuter.

Exemple :


dynamic person = "人";string firstName = person.FirstName;

Ces deux lignes de code peuvent être compilées par le compilateur, mais une erreur sera signalée après avoir cliqué sur exécuter :

Il est à noter que bien que le type dynamique soit utile, il a un prix.

(3) Contient DLR ScriptRuntime

pour ajouter des scripts au Les fonctions d'édition d'application et la transmission de valeurs vers et depuis des scripts permettent aux applications d'utiliser des scripts pour terminer leur travail.

(4) DynamicObject et ExpandoObject

de Vous pouvez créer vos propres objets dynamiques en dérivant DynamicObject ou en utilisant ExpandoObject.

L'utilisation de la dérivation DynamicObject pour créer des objets dynamiques nécessite de remplacer trois méthodes : TrySetMembe(), TryGetMember() et TryInvokeMember().

La différence entre l'utilisation de ExpandoObject et DynamicObject pour dériver est qu'il n'est pas nécessaire de remplacer les méthodes.

Exemple :

class Program
{
    static void Main(string[] args)
    {
        Func<string, string, string> getFullName = (f, l) => { return f + " " + l; };
        dynamic byexobj = new ExpandoObject();
        byexobj.FirstName = "李";
        byexobj.LastName = "四";
        byexobj.GetFullName = getFullName;
        Console.WriteLine(byexobj.GetType());
        Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName));
        Console.WriteLine("=====================");
        dynamic dyobj = new MyDynamicObject();
        dyobj.FirstName = "张";
        dyobj.LastName = "三";
        dyobj.GetFullName = getFullName;
        Console.WriteLine(dyobj.GetType());
        Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName));
        Console.ReadKey();
    }
}

public class MyDynamicObject : DynamicObject
{
    Dictionary<string, object> dynamicData = new Dictionary<string, object>();
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        dynamicData[binder.Name] = value;
        return true;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        bool success = false;
        result = null;
        if (dynamicData.ContainsKey(binder.Name))
        {
            result = dynamicData[binder.Name];
            success = true;
        }
        else
        {
            result = "未找到该属性的值";
            success = false;
        }
        return success;
    }
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        dynamic method = dynamicData[binder.Name];
        result = method((string)args[0],(string)args[1]);
        return result != null;
    }
}

Exécutez le code ci-dessus, le résultat est le suivant :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn