По разным причинам я динамически создаю C # лямбду, используя возможности дерева выражений.например, я могу сделать Funcво время выполнения, как показано в следующем фрагменте.
public static bool myMethod( object obj ) { … }
// Construct a Func<string,bool>
var myMethod = GetType().GetMethod("myMethod");
var lambdaParams = new ParameterExpression[] {Expression.Parameter(typeof (string))};
var callMyMethod = Expression.Call(myMethod, lambdaParams);
var lambda = Expression.Lambda(typeof(Func<string,bool>), callMyMethod, lambdaParams);
var del = (Func<string,bool>)lambda.Compile();
del("foo"); // works
Однако, если я использую тот же код, чтобы попытаться сделать Funcили Funcон взрывается там, где указано со следующим странным исключением:
// Construct a Func<DateTime,bool> or perhaps a struct type fails... why?
var myMethod = GetType().GetMethod("myMethod");
var lambdaParams = new ParameterExpression[] {Expression.Parameter(typeof (DateTime))};
var callMyMethod = Expression.Call(myMethod, lambdaParams); // Blows up here…
System.ArgumentException: Expression of type 'System.DateTime' cannot be used for parameter of type 'System.Object' of method 'Boolean myMethod(System.Object)'
Итак, строка работает, а List работает, но int32 не работает и DateTime.Что здесь происходит?Я не знаю, как работают глубокие внутренности C #, но я предполагаю, что это из-за того, что int действительно обрабатывается как примитив и, возможно, DateTime (будучи структурой) ...
Любая помощь в этомс благодарностью.
спасибо, Пэт