SORU
20 NİSAN 2009, PAZARTESİ


bir dönüştürme .net İşlev<T&; gt için .net İfade<İşlev<T>>

Bir İfade için bir lambda giden kolay bir yöntem çağrısı kullanarak

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

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

Ama bu İşlev yalnızca ender durumlarda, bir ifade için teslim etmek istiyorum...

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

O çalışmıyor olduğum derleme zamanı hatası Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>' verir. Açık bir tonunu durumu çözmek değil. Bakan olduğum bir tesis yapmak için bu var mı?

CEVAP
20 NİSAN 2009, PAZARTESİ


Ooh, hiç kolay değil. Func<T> delegate bir genel ve bir ifade değil temsil eder. Eğer herhangi bir şekilde yapabilirsin yani (nedeniyle optimizasyon ve diğer işler ile derleyici, bazı veriler olabilir atılır, bu yüzden olabilir imkansız olsun özgün ifade geri), olur sökmek, IL anında yapma, ifade (ki hiç kolay). Verileri (Expression<Func<T>>) olarak lambda ifadeleri tedavi bir sihirli tarafından yapılırderleyici(temel olarak derleyici IL derleme yerine kod içinde ifade bir ağaç oluşturur).

Aslında ilgili

Bu aşırı Lambda (Lisp gibi) itme dilleri genellikle uygulamak için daha kolay olmasıdırtercümanlar. Bu dillerde kod ve veri temelde aynı şeyi (bile vardırçalışma zamanı), ama bizim çip anlayamaz o formun kod var, bu yüzden taklit etmek için böyle bir makine tarafından inşa tercüman üstünde o anlar (kararı ile Lisp gibi diller) ya da ödün gücü (kod olacak artık tam olarak eşit veri) için bir ölçüde (kararı ile C#). C# derleyici Lambda olarak yorumlanabilir vererek veri kodu olarak tedavi yanılsamasını verirkod(Func<T>)veri(Expression<Func<T>>)derleme zamanı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • beautyexchange

    beautyexchan

    4 EYLÜL 2006
  • Mr. H

    Mr. H

    1 Temmuz 2012
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011