在运行时创建一个Func <t>并将其设置在目标对象</t>上

时间:2011-10-15 13:30:52

标签: c# reflection

我有一个类声明了要创建的属性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 个答案:

答案 0 :(得分:3)

  

CreateDelegate(Type, MethodInfo)
  创建指定类型的委托以表示指定的静态方法

这是一个实例方法。所以你需要传入一个实例:

CreateDelegate(funcType, this, targetMethod)