- Expression trees: invoking a method with out or ref arguments
- class Program
- {
- static void Main( string[] args )
- {
- var fooExpr = Expression.Parameter( typeof( Foo ), "f" );
- var parmExpr = Expression.Parameter( typeof( int ).MakeByRefType(), "i" );
- var method = typeof( Foo ).GetMethod( "Method1" );
- var invokeExpr = Expression.Call( fooExpr, method, parmExpr );
- var delegateType = MakeDelegateType( typeof( void ), new[] { typeof( Foo ), typeof( int ).MakeByRefType() } );
- var lambdaExpr = Expression.Lambda( delegateType, invokeExpr, fooExpr, parmExpr );
- dynamic func = lambdaExpr.Compile();
- int x = 4;
- func( new Foo(), ref x );
- Console.WriteLine( x );
- }
- private static Type MakeDelegateType( Type returnType, params Type[] parmTypes )
- {
- return Expression.GetDelegateType( parmTypes.Concat( new[] { returnType } ).ToArray() );
- }
- }
- class Foo
- {
- public void Method1( ref int x )
- {
- x = 8;
- }
- }
- class Program
- {
- static void Main( string[] args )
- {
- var fooExpr = Expression.Parameter( typeof( Foo ), "f" );
- var parmExpr = Expression.Parameter( typeof( int ).MakeByRefType(), "i" );
- var method = typeof( Foo ).GetMethod( "Method1" );
- var invokeExpr = Expression.Call( fooExpr, method, parmExpr );
- var delegateType = MakeDelegateType( typeof( void ), new[] { typeof( Foo ), typeof( int ).MakeByRefType() } );
- var lambdaExpr = Expression.Lambda( delegateType, invokeExpr, fooExpr, parmExpr );
- dynamic func = lambdaExpr.Compile();
- int x = 4;
- func( new Foo(), out x );
- Console.WriteLine( x );
- }
- private static Type MakeDelegateType( Type returnType, params Type[] parmTypes )
- {
- return Expression.GetDelegateType( parmTypes.Concat( new[] { returnType } ).ToArray() );
- }
- }
- class Foo
- {
- public void Method1( out int x )
- {
- x = 8;
- }
- }
- typeof(int).MakePointerType
- typeof( int ).MakeByRefType()
- var parmExpr = Expression.Parameter( typeof( int ).MakeByRefType(), "i" );
- var delegateType = MakeDelegateType( typeof( void ), new[] { typeof( Foo ), typeof( int ).MakeByRefType() } );