ufcpp / UfcppSample

http://ufcpp.net/ 向けのサンプル
Apache License 2.0
136 stars 39 forks source link

『dynamicの内部実装』の動的コード生成に関する説明について #319

Open toonmoondaemon opened 4 years ago

toonmoondaemon commented 4 years ago

dynamicの内部実装CallSite.Target 内での動的コード生成の説明で、

その結果、Target が以下のような状態に更新されます。 (中略) ここで、((Point)x).X の部分を生成するのが CallSiteBinder の役目です。

とありますが、実際に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
                    )
                )
            );
    }
}