У меня есть (например) Func<int, int>
, который я хочу вызывать как обычно, за исключением того, что параметр имеет тип object
, а не 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
. Любые идеи о том, как убедиться, что аргумент имеет правильный тип?
arg
,object
, который не подходит для функции с параметром типаint
. - person   schedule 09.05.2013