konvertieren eines .net-Func - <T> ein .net-Ausdruck<U<T>>

Geht aus einem lambda-Ausdruck ein Ausdruck ist einfach über einen Aufruf der Methode...

public void GimmeExpression(Expression<Func<T>> expression)
{
    ((MemberExpression)expression.Body).Member.Name; //"DoStuff"
}

public void SomewhereElse()
{
    GimmeExpression(() => thing.DoStuff());
}

Aber ich würde gerne die Func in einem Ausdruck, nur in seltenen Fällen...

public void ContainTheDanger(Func<T> dangerousCall)
{
    try 
    {
        dangerousCall();
    }
    catch (Exception e)
    {
        //This next line does not work...
        Expression<Func<T>> DangerousExpression = dangerousCall;
        var nameOfDanger = 
            ((MemberExpression)dangerousCall.Body).Member.Name;
        throw new DangerContainer(
            "Danger manifested while " + nameOfDanger, e);
    }
}

public void SomewhereElse()
{
    ContainTheDanger(() => thing.CrossTheStreams());
}

Die Zeile, die nicht arbeiten, gibt mir die compile-Zeit-Fehler Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. Eine explizite Umwandlung löst nicht die situation. Besteht die Möglichkeit, das zu tun, ich bin mit Blick?

Sehe ich nicht wirklich viel Verwendung für die "seltenen Fall" Beispiel. Der Aufrufer übergibt die Func - <T>. Es gibt keine Notwendigkeit, zu wiederholen, an den Aufrufer zurück, was das Func<T> (über die Ausnahme).
Die Ausnahme nicht behandelt, in der Anrufer. Und, weil es mehrere call-sites übergeben in verschiedenen Func<T>s, fangen Sie die Ausnahme in der Anrufer schafft Doppelarbeit.
Die Ausnahme-stack-trace wird konstruiert, um zu zeigen, diese Informationen. Wenn die exception geworfen wird in dem Aufruf der Func - <T>, dies wird show in der Stapel-Ablaufverfolgung. Übrigens, wenn Sie zu wählen, in die andere Richtung gehen, D. H. einen Ausdruck akzeptieren und kompilieren es für den Aufruf, würden Sie diese verlieren, da der stack-trace, die zeigen würde, so etwas wie at lambda_method(Closure ) für den Aufruf der kompilierten delegieren.
Ich denke, Sie sollten sich auf die Antwort in diesem [link][1] [1]: stackoverflow.com/questions/9377635/create-expression-from-func/...

InformationsquelleAutor Dave Cameron | 2009-04-20

Schreibe einen Kommentar