2017-06-27 2 views
0

すべて私はラムダ式が実行時にも準拠した時間にどのように機能するかを調べようとしています。下のようなソースコードがあるとします。 enter image description hereラムダ式のソースコードを実行時(C#)に表示する方法はありますか?

現在、変数をすばやく確認しようとしました。しかし残念ながら。 Funのソースコードを表示することはできません。実際にFunc<int> ageCalculatorを実行するコードを表示する方法はありますか。ありがとう。

は、リフレクタ種類のツールで

ませ幸運なものを更新しません。 dotPeekでご覧ください。ありがとう。

enter image description here

更新

オプションが有効になっているときに複数の項目(コンパイル生成されたクラスの項目)がツリーに表示があります。しかし、これらの項目をダブルクリックしました。 MyTempClassのソースコードを表示するだけで新しいものは表示されません。それは何を表示すると思いますか?ありがとう。

enter image description here

+0

、それを実行するために、その表現とCompile().Invoke()を見るためにToString()を呼び出すことができリフレクターを使用してアセンブリを読みますか? –

+1

'' 'Func ageCalculator'''を呼び出している場所より1行早く定義しています。だから、ポップアップの背後に隠れている '' AgeC .... ''のメソッドを実行するだろうということは分かりますか? –

+0

@RickvandenBoschこれは、この質問内で簡単にするためのものだと思います。 – HimBromBeere

答えて

1

重要な問題は、コンパイルされたラムダを返したFuncを返すことによって、代わりにExpression<Func<int>>を返すことです。その後、

Expression<Func<int>> AgeCalculator() { 
    int myAge = 30; 
    return() => myAge; 
} 

public void Closure() { 
    var ageCalculator = AgeCalculator(); 
    Console.WriteLine(ageCalculator.ToString()); 
    Console.WriteLine(ageCalculator.Compile().Invoke()); 
} 
+0

これが取得されました。生成されたクラスコードを表示する新しいラムダ式のように聞こえる。 '()=> value(xxxnamespace.xxxtestclass +()c_DisplayClass1_0.myAge)'のように見えます。 'value'はどういう意味ですか?私はMSDNでそれを見つけられませんでした。ありがとう。 –

+0

私は、 'console'に' ageCalculator.ToString() 'が表示されることを意味しました。 –

+1

'value(xxxnamespace.xxxtestclass +()c_DisplayClass1_0.myAg e)'はキャプチャされたコンテキスト変数myAgeの値を返します。 –

1

何もありませんので、あなたは、C#のソースコードを参照することはできません。コンパイラによって自動的に生成されるクラスがあるので、あなたが見ることができるのは中間コード(IL)だけです。そのILコードは、Reflectorのような他のツール(私はVisual Studioに統合されたそのようなツールがないので、試してみることはできません)によってC#として表示されることがあります。あなたは「ショーコンパイラ生成されたコードを」有効にすると

あなたはdotPeekでそれを見ることができます:

dotPeek Setting

次に、右クリックして、生成されたコードを示すために「逆コンパイルソース」を選択:

dotPeek Showing the generated class

+0

dotPeekの 'Func'に対して生成されたクラスを表示できますか?ありがとう。 –

+0

オプションを有効にした後、ツリーに表示されるアイテム(生成されたクラス)が増えています。しかし、生成されたクラスコードはまだ内容を見ることができません。 '<> c_DisplayClass1_0'に似ています。ダブルクリックします。これは私の投稿のような '' MyTempClass'ソースコードを表示するだけです。ありがとう。 –

+0

@ Joe.wang:スクリーンショットを交換し、追加情報を –

0

意図したとおり、完全には使用されていないものがあります。 )(この例では

class Program 
{ 
    static void Main(string[] args) 
    { 
     // You do not call the method to assign it to the variable, 
     // you point to the method (without parentheses) 
     Func<int> answer = GetTheAnswerToEverything; 

     // Here you actually call the method 
     Console.WriteLine(answer()); 
     Console.ReadLine(); 
    } 

    // This is the method that you call when you write **add()** 
    private static int GetTheAnswerToEverything() => 42; 
} 

あなたは答えを呼び出すとき、あなたが実際にGetTheAnswerToEverythingメソッドを呼び出します。以下のコードを考えてみてください。詳細について

Func Delegate

はパラメータはありませんとTResultパラメーターによって指定された型の値を返すメソッドをカプセル化参照。私は、これはそれが何をしたいのですが、多分それはあなたが探しているものだ一部のビューTreeILLinqPad持っているかどうかわからないんだけど

+0

'Console.WriteLine(ageCalculator.ToString());'のように 'Closure()'で印刷しようとしました。しかし、 'System.Func〜1 [System.Int32]'のような情報しか得られませんでした。 –

+0

これは、あなたがメソッドを呼び出していないからです。あなたはそれを指しています。結果を印刷したい場合は、メソッド '' 'Console.WriteLine(ageCalculator());' '' –

0

....

enter image description here enter image description here

+0

を呼び出してください。LinqPadはアセンブリdllからラムダの詳細(ソースコードや生成されたクラスコードなど)を表示できますか? ? –

+0

BTW。ラムダ式を除算するときに、実際に動作しているソースコードを表示する方が良いのではないでしょうか。右? –

+0

ILタグは生成されたコードです...ラムダ式について何を期待しているのでしょうか、おそらくソースコードhttps://referencesource.microsoft.com/#System.Core/System/Linqを読んでいるのでしょうか? /Enumerable.cs,6dbbba50dd6655cd – jjchiw

関連する問題