Создать Func <T>во время выполнения и установить его на целевой объект - PullRequest
0 голосов
/ 15 октября 2011

У меня есть класс, который объявляет свойство Func, которое он хочет создать

 public class ThingWithAFuncProperty
{
    public Func<string> CreateSomething { get; set; }
}

У меня есть класс инжектора, который использует контейнер ioc для создания Func и внедрения его в свойство:

РЕДАКТИРОВАТЬ: Извините, я на самом деле использовал неверный тип для передачи getFactory, но ошибка та же

public class Injector
{
    bool IsFuncProperty(PropertyInfo property)
    {
        return typeof(Func<>).IsAssignableFrom(property.PropertyType);
    }

    public T FactoryMethod<T>()
    {
        return this.iocContainer.Resolve<T>();
    }

    object GetFactory(Type type)
    {
        var mi = this.GetType().GetMethod("FactoryMethod", BindingFlags.Public |
            BindingFlags.Instance | BindingFlags.NonPublic);
        var targetMethod = mi.MakeGenericMethod(type);
        Type funcType = typeof(Func<>).MakeGenericType(type);
        return Delegate.CreateDelegate(funcType, targetMethod);
    }

    public void Inject(object instance)
    {
        foreach (var property in instance.GetType().GetProperties())
        {
            if (IsFuncProperty(property))
            {
                //property.SetValue(instance, GetFactory(property.PropertyType), null);
                 var funcArgType = property.PropertyType.GetMethod("Invoke").ReturnType;
                 property.SetValue(instance, GetFactory(funcArgType), null);
            }
        }
    }
}

Это не работает, и я продолжаю кеттинг ошибки, которую делегат не может привязать к целевому типу,Может кто-нибудь помочь мне заставить это работать, пожалуйста

1 Ответ

3 голосов
/ 15 октября 2011

CreateDelegate(Type, MethodInfo)
Создает делегата указанного типа для представления указанного статического метода .

Это метод экземпляра. Так что вам нужно либо передать экземпляр:

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