【问题标题】:How to detect if a type is a Func<T> and get the type of the T [duplicate]如何检测类型是否为 Func<T> 并获取 T 的类型 [重复]
【发布时间】:2009-06-25 21:54:41
【问题描述】:

我想知道是否可以升级我用来支持延迟加载的基本 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&lt;X&gt;的实例,如果是,X的类型是什么?

【问题讨论】:

    标签: c# generics ioc-container


    【解决方案1】:

    看看今天早上的这个问题 - 可能会给你一个好的开始 - C# generic list <T> how to get the type of T?

    【讨论】:

    • 确实,将List 替换为Func 就完成了……
    • 是的,看起来这对我有用。谢谢 现在我有一个问题,编译器不允许我从 () => Resolve(theArgumentType) 转换回原始 T (即使我尝试先转换为对象)。 “无法将 lambda 表达式转换为类型 'T',因为它不是委托类型”
    【解决方案2】:

    我误解了你的问题。

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

    但是,这应该可以。

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

    【讨论】:

    • 好的,我想我明白为什么它不可能了。很遗憾,因为这对于 IoC 容器来说是一个不错的功能。
    【解决方案3】:

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

    【讨论】:

    • 我还不想调用它,我想把 Func 本身传回去,以便调用者可以在准备好时调用它
    • 那你需要把它转换成 Func
    • 我误会了;见第二个答案。
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2013-04-19
    • 2016-05-01
    相关资源
    最近更新 更多