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

大家讲道理
Libérer: 2017-04-11 14:05:59
original
2213 Les gens l'ont consulté

(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;
Copier après la connexion

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;
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!