Нет, ты не можешь.
Например, в C # вы не можете:
Type t = typeof(int);
List<t> list = new List<t>();
или
object list = new List<t>();
Если вы не используете отражение, но затем вы должны поместить список в object
, и вы можете использовать его только через отражение.
Итак, если вы хотите, вы можете сохранить Func<>
в object
(или dynamic
), но не более.
То, что вы МОЖЕТЕ сделать, это всегда возвращать Func<object, bool>
и приводить объект к требуемому типу В функции лямбда (так что используйте Expression.Convert(pe, theType)
);
Или вы можете использовать динамический:
// lambda == Func<Foo, bool>
dynamic lamdba = Expression.Lambda(expr, new ParameterExpression[] { pe }).Compile();
bool res = lambda(myvalue);
или
// lambda == Func<Foo, bool>
Delegate lamdba = Expression.Lambda(expr, new ParameterExpression[] { pe }).Compile();
bool res = (bool)lambda2.DynamicInvoke(t);
Для некоторых «не настоящих» тестов (в StopWatch.Ticks смотрите их только для пропорций) (Режим выпуска + Запуск без отладки + некоторые бесполезные циклы, чтобы они были «горячими»):
236384685 dynamic
56773593 Func<object, bool> + cast
10556024247 DynamicInvoke
как примечание, Func<Foo, bool>
имеет такую же скорость, поэтому при дополнительном использовании скорость не теряется.
Вы можете увидеть код здесь http://ideone.com/qhnVP3