Создание во время выполнения универсального Func <T> - PullRequest
15 голосов
/ 18 марта 2009

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

object GetFactory(Type type);

Этот метод должен возвращать Func , где typeparam 'T' является 'type'.

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

Есть идеи?

Ответы [ 3 ]

26 голосов
/ 18 марта 2009

Вы используете 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, которая принимает целевой экземпляр.

0 голосов
/ 18 марта 2009

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

0 голосов
/ 18 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...