这个问题在这里已经有一个答案:

我想知道我是否可以升级我使用的基本IOC容器来支持懒惰负载。因此,如果我已经注册了IFOO,我希望IOC容器知道如何实现以下两个依赖项(第一个是IOC容器的标准方式,而第二个则返回一个简单的委托,该简单委托在何时呼叫该容器中以供IFOO它被调用)。

public Bar(IFoo x)

public Bar2(Func<IFoo> lazyFoo)

当我尝试编写将实际执行此操作的代码时,问题就到了。是否存在将以下伪代码编译的语法?

public T Resolve<T>()
{
    if (T is Func<X>)
        return (T) () => Resolve(typeof(X));
    return (T)Resolve(typeof(T));
}

或以换句话说,如果我有类型 T, ,如何检测是否是 Func<X>, ,如果是这样,什么是 X?

有帮助吗?

解决方案

看看今天早上的这个问题 - 可能会给您一个良好的开始 - C#通用列表u003CT>如何获得T的类型?

其他提示

我误解了你的问题。

由于编译器必须具有代表类型来创建lambda时,因此不可能以一个函数的方式执行此操作。

但是,这应该起作用。

public T Resolve<T>()
{
    return (T)Resolve(typeof(T));
}

public Func<T> LazyResolve<T>()
{
    return () => Resolve<T>();
}

为了回答评论中的问题,您需要调用lambda的表达,而不是施放它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top