3

我想知道是否可以升级我用来支持延迟加载的基本 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什么?

4

3 回答 3

3

看看今天早上的这个问题 - 可能会给你一个好的开始 - C# generic list <T> 如何获取 T 的类型?

于 2009-06-25T22:01:14.230 回答
1

我误解了你的问题。

不可能以您尝试的方式在一个函数中执行此操作,因为编译器必须具有委托类型才能在编译时创建 lambda。

但是,这应该有效。

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

public Func<T> LazyResolve<T>()
{
    return () => Resolve<T>();
}
于 2009-06-26T12:19:54.680 回答
0

在回答评论中的问题时,您需要调用 lambda 表达式,而不是强制转换它。

于 2009-06-25T22:21:13.813 回答