Создание времени создания общего Func <T>

Мне нужно реализовать метод:

object GetFactory(Type type);

Этот метод должен возвращать Func <T> где typeparam 'T' - это тип.

Итак, моя проблема в том, что я не знаю, как создать Func <? > во время выполнения с использованием отражения. Activator.CreateInstance не работает, потому что на делегатах нет конструкторов.

Любые идеи?

Ответы

Ответ 1

Вы используете Delegate.CreateDelegate, то есть от MethodInfo; ниже, я жестко закодирован, но вы бы использовали некоторую логику или Expression, чтобы получить фактический метод создания:

using System;
using System.Reflection;
class Foo {}

static class Program
{
    static Func<T> GetFactory<T>()
    {
        return (Func<T>)GetFactory(typeof(T));
    }
    static object GetFactory(Type type)
    {
        Type funcType = typeof(Func<>).MakeGenericType(type);
        MethodInfo method = typeof(Program).GetMethod("CreateFoo",
            BindingFlags.NonPublic | BindingFlags.Static);
        return Delegate.CreateDelegate(funcType, method);
    }
    static Foo CreateFoo() { return new Foo(); }
    static void Main()
    {
        Func<Foo> factory = GetFactory<Foo>();
        Foo foo = factory();
    }
}

Для нестатических методов существует перегрузка Delegate.CreateDelegate, которая принимает целевой экземпляр.

Ответ 2

Я думаю, что обычный подход состоял бы в том, чтобы сделать "тупой" вариант тем, что вы обманываете в runtme, а затем предоставляете вспомогательный метод расширения для предоставления версии с типом безопасности поверх нее.

Ответ 3

вы можете создавать объекты Expression вместо func и компилировать() выражение для получения делегата Func.