Open toonmoondaemon opened 4 years ago
dynamicの内部実装のCallSite.Target 内での動的コード生成の説明で、
その結果、Target が以下のような状態に更新されます。 (中略) ここで、((Point)x).X の部分を生成するのが CallSiteBinder の役目です。
とありますが、実際にBindメソッドが生成を担うのはif (x is Point) return ((Point)x).X;の部分ではないでしょうか?
Bind
if (x is Point) return ((Point)x).X;
雑実装ですが、以下のようにif、is、returnも書く感じになるかと思います。
public class PropertyXBinder : CallSiteBinder { public override Expression Bind(object[] args, ReadOnlyCollection<ParameterExpression> parameters, LabelTarget returnLabel) { var arg = args[0]; var argType = arg.GetType(); var property = argType.GetProperty("X"); var parameter = parameters[0]; return Expression.IfThen( Expression.TypeIs( parameter, argType ), Expression.Return( returnLabel, Expression.Property( Expression.Convert( parameter, argType ), property ) ) ); } }
dynamicの内部実装のCallSite.Target 内での動的コード生成の説明で、
とありますが、実際に
Bind
メソッドが生成を担うのはif (x is Point) return ((Point)x).X;
の部分ではないでしょうか?雑実装ですが、以下のようにif、is、returnも書く感じになるかと思います。