这段代码适用于.NET4:
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;
}
}
怎么会这样呢?唯一的区别在于使用ref还是out参数。
ref
而不是out
会发生什么?另外,如果您使用正确的out
等签名声明委托类型,并尝试静态类型编译的 lambda,会发生什么? - Marc Gravell