通常,使用typeof:
获取未构造的泛型类型是很容易的。Type genericType = typeof( Func<> );
我希望下面的代码也能工作,但是它给出了一个编译错误Type expected
。
Type genericNestedType = typeof( Func<Func<>> );
通过使用Func<Func<object>>
来解决这个问题相对容易。然而,当你"消费"这个类型时,你必须记住调用GetGenericTypeDefinition()
。
想要"填充"所有未赋值的泛型类型参数的场景是不可能的。同样,创建一个虚拟类型来指示这些参数也相对容易。(如Func<Func<ToReplace, object, int>>
)
是否有typeof
不能在嵌套的泛型非构造类型上工作的原因?
我不认为这是一个编译器错误——c# 4规范的第7.6.11节(typeof
操作符)似乎没有给出任何导致它有效的语法;Func<Func<>>
既不是有效的类型构造,也不是有效的 unbind -type-name构造。
我惊喜地发现在执行时是可能的:
Type unbound = typeof(Func<>);
Type partiallyBound = unbound.MakeGenericType(new[] { unbound });
Console.WriteLine(partiallyBound);
我有一半的希望它在。net类型系统中是无效的,尽管我认为这可能会导致其他问题。
我怀疑的主要原因是typeof( Func<Func<>> )
不是很有用。它不是一个完全构造的类型,所以你不能使用它做任何事情——它也不是一个泛型类型定义,所以你不能调用MakeGenericType(...)
来将T
添加到外部类型——它是内部类型,需要T
,所以你需要做这样的事情:
var closedType = type.GetGenericTypeDefinition().MakeGenericType(
type.GetGenericTypeArguments().MakeGenericType(finalT)
);
那么简单…在typeof(Func<Func<>>)
中没有实际用途- 更容易从头开始