我正在使用Ninject 1.0,希望能够将懒惰的初始化委托注入构造函数中。因此,给定通用委托定义:

public delegate T LazyGet<T>();

我只想将此绑定到IKernel.Get(),以便可以将惰性获取器传递给构造函数,例如
public class Foo
{
    readonly LazyGet<Bar> getBar;

    public Foo( LazyGet<Bar> getBar )
    {
        this.getBar = getBar;
    }
}

但是,我不能简单地调用Bind<LazyGet<T>>(),因为它是一个开放的泛型类型。我需要这是一个开放的泛型,这样我就不必将所有不同的懒惰对象绑定到显式类型。在上面的示例中,应该可以动态创建调用IKernel.Get<T>()的通用委托。

Ninject 1.0如何实现?

最佳答案

不能完全理解问题,但是可以使用反射吗?就像是:

// the type of T you want to use
Type bindType;
// the kernel you want to use
IKernel k;

// note - not compile tested
MethodInfo openGet = typeof(IKernel).GetMethod("Get`1");
MethodInfo constGet = openGet.MakeGenericMethod(bindType);

Type delegateType = typeof(LazyGet<>).MakeGenericType(bindType);
Delegate lazyGet = Delegate.CreateDelegate(delegateType, k, constGet);

使用lazyGet是否可以做你想做的事情?请注意,如果在编译上下文中不知道bindType,则可能还必须通过反射来调用Foo类。

07-26 00:28