我有(例如)一个Func<int, int>
我想像往常一样调用的,除了参数的类型为object
rater than int
。我只知道 Func 的确切类型和运行时的参数,因为 Func 是使用表达式树创建的,现在可以从dynamic
变量中访问。(简化)代码示例:
using System.Linq.Expressions;
namespace FuncExample
{
class Program
{
static void Main(string[] args)
{
object myFunc = CreateFunc(); // Could return something like
// Func<int, int>, but may return a
// completely different Func<> depending on
// arguments etc.
object result = getFromFunc(5, myFunc);
}
public static object CreateFunc()
{
LambdaExpression expr = Expression.Lambda(
/*
* Create an expression
*/
);
return expr.Compile();
}
public static object getFromFunc(object arg, object func)
{
dynamic dynFunc = func;
return dynFunc(arg); // <------- Throws exception
}
}
}
如何使代码转换arg
为整数或参数的任何类型?我尝试制作一个通用方法,将对象转换为某种类型,然后通过反射调用它,如下所示:
public static T asT<T>(object n)
{
return (T)n;
}
对于getFromFunc
:
MethodInfo con = typeof(Program).GetMethod("asT").MakeGenericMethod(func.GetType().GetGenericArguments()[0]);
return dfunc(con.Invoke(null, new[] { value }));
但MethodInfo.Invoke
也有回报object
。关于如何确保参数具有正确类型的任何想法?