请问在下面的代码中,怎样把GetObject函数返回的值与一个Decimal值比较呢?谢谢class Program
{
public static object GetObject()
{
int i = 1;
return i;
} static void Main(string[] args)
{
MethodInfo mi = typeof(Program).GetMethod("GetObject", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); Expression e1 = Expression.Call(mi);
Expression e2 = Expression.Constant(new decimal(1));
e1 = Expression.Convert(e1, e2.Type);
Expression e3 = Expression.Equal(e1, e2); LambdaExpression le = Expression.Lambda(e3);
Delegate d = le.Compile();
object o = d.DynamicInvoke();//这里抛出InvalidCastException
Console.WriteLine(o.ToString());
}
}
{
public static object GetObject()
{
int i = 1;
return i;
} static void Main(string[] args)
{
MethodInfo mi = typeof(Program).GetMethod("GetObject", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); Expression e1 = Expression.Call(mi);
Expression e2 = Expression.Constant(new decimal(1));
e1 = Expression.Convert(e1, e2.Type);
Expression e3 = Expression.Equal(e1, e2); LambdaExpression le = Expression.Lambda(e3);
Delegate d = le.Compile();
object o = d.DynamicInvoke();//这里抛出InvalidCastException
Console.WriteLine(o.ToString());
}
}
{
public static object GetObject()
{
int i = 1;
return i;
} static void Main(string[] args)
{
MethodInfo mi = typeof(Program).GetMethod("GetObject", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); Expression e1 = Expression.Call(mi); Expression e2 = Expression.Convert(e1, typeof(decimal)); object o = Expression.Lambda(e2).Compile().DynamicInvoke();//InvalidCastException
Console.WriteLine(o.ToString());
}
}
调用LambdaExpression的Compile方法动态生成一个委托对象 使用DynamicInvoke方法调用该委托对象,获取其返回值
LambdaExpression lambda = Expression.Lambda(expr);
Delegate d= lambda.Compile();
d.DynamicInvoke(null);
参考
MethodInfo mi = typeof(Program).GetMethod("GetObject", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); Expression e1 = Expression.Call(mi);
Expression e2 = Expression.Constant(new decimal(1));
//e1 = Expression.Convert(e1, e2.Type);
e1 = Expression.Convert(e1, e2.Type, typeof(Convert).GetMethod("ToDecimal", new Type[] { typeof(object) }));
Expression e3 = Expression.Equal(e1, e2); LambdaExpression le = Expression.Lambda(e3);
Delegate d = le.Compile();
object o = d.DynamicInvoke();//这里抛出InvalidCastException
Console.WriteLine(o.ToString());