2016-10-25 9 views
2

List<LambdaExpression>Expression<Func<T, returnT>>の異なるオブジェクトが配置され、実行時にdynamicを使用してExpression<Func<T, returnT>>を受け入れるメソッドと一致する作業コードがあります。これは初めてのdynamicの使用でしたが、私はその役割や機能を十分に理解していると感じています。私が興味を持っているのは、LambdaExpressionからExpression<Func<T, returnT>>への関係/解像度です。コードは以下である:LambdaExpressionは、実行時に動的にExpression <Func <T, returnT>>に変換されますか?

public void DoIt(Expression<Func<Record, string>> expr) { ... } 
public void DoIt(Expression<Func<Record, int?>> expr) { ... }   
public void DoIt(Expression<Func<Record, DateTime?>> expr) { ... } 


public class Record { 
    public string Member1; 
    public int? Member2; 
    public DateTime? Member3; 
} 

Expression<Func<Record, string>> expr1 = r => r.Member1; 
Expression<Func<Record, int?>> expr2 = r => r.Member2; 
Expression<Func<Record, DateTime?>> expr3 = r => r.Member3; 

var myList = new List<LambdaExpression>() { 
    expr1, expr2, expr3 
}; 

//later... 

foreach (var expr in myList) 
{ 
    DoIt((dynamic) expr); 
    //What is happening w/ this LambdaExpression obj 
    //so that it dispatches the appropriate DoIt method? 
} 
+1

* Dynamic Dispatch *を検索してください。たとえば、ここでは[動的言語ランタイムの概要](https://msdn.microsoft.com/en-us/library/dd233052(v = vs.110).aspx) –

+1

Thxです。私はそれがダイナミックなディスパッチであることを知っていましたが、私はこのインスタンスでダイナミックの振る舞いが 'LambdaExpression'とやや排他的だと思ったと思います。もう少し読んだら、今はそうではないと思う。 –

答えて

1

Expression<TDelegate>LambdaExpression由来します。 MSDNから

:実行時に

、>ラムダ 式は常に型の式の< TDelegateで表す式ツリーノード。あなたは、動的にLambdaExpressionを変換する - - オブジェクトのタイプを決定するためにDLRを使用するExpression<TDelegate>LambdaExpressionから派生しているという事実に加えて

1

あなたのオブジェクトはLambdaExpressionではありませんが、実行時にどのようなタイプになるでしょう。メソッドのオーバーロードを呼び出すので、呼び出すオーバーロードを知っています。

スタティックタイピング(var/LambdaExpression)を使用している場合、オーバーロードは実行時に決定されます。あなたのケースでは、LambdaExpression過負荷がないので、動的に変換せずにコンパイルされません。

動的タイピングを使用する場合、DLRを使用して実行時にオーバーロードが決定されます

関連する問題