我想知道我是否可以升级我用来支持延迟加载的基本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>
的实例,如果是,那么{{1}的类型是什么}}?
答案 0 :(得分:3)
从今天早上看看这个问题 - 可能会给你一个良好的开端 - C# generic list <T> how to get the type of T?
答案 1 :(得分:1)
我误解了你的问题。
在一个函数中执行它是不可能的,因为编译器必须有一个委托类型来在编译时创建lambda。
然而,这应该有用。
public T Resolve<T>()
{
return (T)Resolve(typeof(T));
}
public Func<T> LazyResolve<T>()
{
return () => Resolve<T>();
}
答案 2 :(得分:0)
在回答评论中的问题时,你需要调用lambda表达式,而不是强制转换它。