Wie drücke ich einen ungültigen Methodenaufruf als Ergebnis von DynamicMetaObject.BindInvokeMember aus?

Ich versuche ein kurzes Beispiel dafür zu gebenIDynamicMetaObjectProvider für die zweite Ausgabe von C # in Depth, und ich stoße auf Probleme.

Ich möchte in der Lage sein, einen ungültigen Anruf auszudrücken, und ich scheitere. Ich bin mir sicher, dass dies möglich ist, denn wenn ich mithilfe des Reflection Binders dynamisch eine Void-Methode aufrufe, ist alles in Ordnung. Hier ist ein kurzes, aber vollständiges Beispiel:

using System;
using System.Dynamic;
using System.Linq.Expressions;

class DynamicDemo : IDynamicMetaObjectProvider
{
    public DynamicMetaObject GetMetaObject(Expression expression)
    {
        return new MetaDemo(expression, this);
    }

    public void TestMethod(string name)
    {
        Console.WriteLine(name);
    }

}

class MetaDemo : DynamicMetaObject
{
    internal MetaDemo(Expression expression, DynamicDemo demo)
        : base(expression, BindingRestrictions.Empty, demo)
    {
    }

    public override DynamicMetaObject BindInvokeMember
        (InvokeMemberBinder binder, DynamicMetaObject[] args)
    {
        Expression self = this.Expression;

        Expression target = Expression.Call
            (Expression.Convert(self, typeof(DynamicDemo)),
             typeof(DynamicDemo).GetMethod("TestMethod"),
             Expression.Constant(binder.Name));

        var restrictions = BindingRestrictions.GetTypeRestriction
            (self, typeof(DynamicDemo));

        return new DynamicMetaObject(target, restrictions);
    }
}

class Test
{
    public void Foo()
    {
    }

    static void Main()
    {
        dynamic x = new Test();
        x.Foo(); // Works fine!

        x = new DynamicDemo();
        x.Foo(); // Throws
    }
}

Dies löst eine Ausnahme aus:

Nicht behandelte Ausnahme: System.InvalidCastException: Der Ergebnistyp 'System.Void' der dynamischen Bindung, die vom Objekt mit dem Typ 'DynamicDemo' für den Ordner 'Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder' erstellt wurde, ist nicht mit dem Ergebnistyp 'System' kompatibel. Objekt 'von der Aufrufsite erwartet.

Wenn ich die Methode ändere, um object und null zurückzugeben, funktioniert das einwandfrei ... aber ich möchte nicht, dass das Ergebnis null ist, ich möchte, dass es nichtig ist. Das funktioniert gut für den Reflection Binder (siehe den ersten Aufruf in Main), aber für mein dynamisches Objekt schlägt es fehl. Ich möchte, dass es wie der Reflection Binder funktioniert - es ist in Ordnung, die Methode aufzurufen, solange Sie nicht versuchen, das Ergebnis zu verwenden.

Habe ich einen bestimmten Ausdruck übersehen, den ich als Ziel verwenden kann?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage