Создание функции, которая преобразует функции одного типа в другой

Для некоторых необычных вещей отражения у меня есть функция типа Func, и мне нужно передать ее в функцию, которая принимает тип Func, где T неизвестен до времени выполнения. Например:

public bool MyOperation(Func<string,bool> op) {
  return _myValues.Any(op);
}

public static bool InvokeOperationMethod(MethodInfo info, object obj,Func<object,bool> opAsObject)
{
   info.Invoke(obj, opAsObject);
}

Проблема в том, что, поскольку у меня есть лямбда более слабого типа, я не могу передать ее в качестве аргумента более сильного типа. Поэтому я попытался создать помощника, который создаст функцию, которая преобразует лямбду более слабого типа в более сильный тип. Например, я мог бы позвонить

var converter = CreateConverter(typeof(string));
Func<object,bool> asObject = o => o.ToString() == "a string"; //Dump example
Func<string,bool> asString = (Func<string,bool>)converter(asObject);
Assert.IsTrue(asInt("a string"));

Конечно, в реальном коде этот тип назначения неизвестен до времени выполнения, и фактический предикат не является тривиальным тестом.

Это моя попытка:

/// <summary>
/// Converts a predicate of Func<object,bool> to
/// Func<Type,bool> of the given type.
/// </summary>
/// <param name="destType">Type of the dest.</param>
/// <param name="predicate">The predicate.</param>
/// <returns></returns>
public static TransformPredicate CreateConverter(Type destType)
{
    // This essentially creates the following lambda, but uses destType instead of T
    // private static Func<Func<object, bool>, Func<T, bool>> Transform<T>()
    // { 
    //     return (Func<object,bool> input) => ((T x) => input(x));
    // }
    var input = Expression.Parameter(typeof(Func<object, bool>), "input");

    var x = Expression.Parameter(destType, "x");
    var convert = Expression.Convert(x, typeof(object));
    var callInputOnX = Expression.Invoke(input, convert);
    var body2 = Expression.Lambda(callInputOnX, x);
    var body1 = Expression.Lambda(typeof(TransformPredicate),body2, input);
    return (TransformPredicate) body1.Compile();
}

public delegate object TransformPredicate(Func<object,bool> weak);

Это на самом деле работает просто отлично, за исключением того, что он работает очень медленно, так как он неявно вызывает CreateDelegate при каждом вызове. Поэтому я попытался вызвать CreateDelegate самостоятельно, добавив:

var destFunc = typeof(Func<,>).MakeGenericType(destType, typeof(bool));
var endType = typeof(Func<,>).MakeGenericType(typeof(Func<object, bool>), destFunc);
return (TransformPredicate)compiled.Method.CreateDelegate(endType);

Это приводит к ошибке:

System.NotSupportedException: производные классы должны предоставлять и реализацию.

Любые идеи, как я могу вызвать CreateDelegate сам?

Ответы на вопрос(1)

Ваш ответ на вопрос