如何检测类型是否为Func <t>并获取T </t>的类型

时间:2009-06-25 21:54:42

标签: c# generics ioc-container

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

3 个答案:

答案 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表达式,而不是强制转换它。