Heim >Backend-Entwicklung >C#.Net-Tutorial >C# Advanced Programming Kapitel 12 Dynamische Spracherweiterung

C# Advanced Programming Kapitel 12 Dynamische Spracherweiterung

大家讲道理
大家讲道理Original
2017-04-11 14:05:592314Durchsuche

(1) DLR

Die dynamische Funktion von C#4 ist Dynamische SpracheSprachlaufzeit(Dynamische Sprachlaufzeit, Teil von DLR). DLR ist eine Reihe von Diensten, die zu CLR hinzugefügt werden.

(2) dynamischer Typ

dynamischer

Typ zulässig Schreiben Sie Code, der die Typprüfung während der Kompilierung ignoriert. Der Compiler geht davon aus, dass jede Operation, die für ein Objekt vom Typ dynamisch definiert ist, gültig ist, und der Compiler prüft vor der Ausführung nicht auf Fehler.

Beispiel:


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

Diese beiden Codezeilen können vom Compiler kompiliert werden, es wird jedoch ein Fehler gemeldet nach dem Klicken auf „Ausführen“:

Es sollte beachtet werden, dass der Typ dynamisch zwar nützlich ist, aber hat seinen Preis.

(3) Enthält DLR ScriptRuntime

zum Hinzufügen von Skripten zum Anwendungsbearbeitungsfunktionen und die Übergabe von Werten an und von Skripten ermöglichen es Anwendungen, Skripte zu verwenden, um ihre Arbeit abzuschließen.

(4) DynamicObject und ExpandoObject

von Sie können Ihre eigenen dynamischen Objekte erstellen, indem Sie DynamicObject ableiten oder ExpandoObject verwenden.

Die Verwendung der DynamicObject-Ableitung zum Erstellen dynamischer Objekte erfordert das Überschreiben von drei Methoden: TrySetMembe(), TryGetMember() und TryInvokeMember().

Der Unterschied zwischen der Verwendung von ExpandoObject und DynamicObject zum Ableiten besteht darin, dass Methoden nicht überschrieben werden müssen.

Beispiel:

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;
    }
}

Führen Sie den obigen Code aus. Das Ergebnis ist wie folgt:

Das obige ist der detaillierte Inhalt vonC# Advanced Programming Kapitel 12 Dynamische Spracherweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn