表达式树不支持动态泛型类型参数吗?

时间:2018-06-23 22:56:40

标签: c# generics dynamic expression-trees

我想动态创建泛型类。要定义类型参数,您将在DefineGenericParameters上调用TypeBuilder方法,并可以使用返回值在类型参数上添加类型约束。

顺便说一句,我正在使用表达式树来发出方法主体。但是后来我意识到,表达式树的API不接受GenericTypeParameterBuilder方法的返回值DefineGenericParameters作为参数。
也许您想知道它是否可以编译。因为类型是从Type派生的,所以它将进行编译。但是表达式树的API在运行时会引发异常,告诉我该类型在Mono上包含通用类型参数,而.NET不支持该方法。

所以在我看来,表达式树无法处理泛型类型参数,但事实确实如此吗?我想念什么吗?
如果是这样,如果您建议使用表达式树处理通用类型参数的其他方法,我将很高兴。

1 个答案:

答案 0 :(得分:0)

  

.NET不支持该方法。

这我可以解释:

要检查类型是否为枚举,请在https://www.shimara.com行的末尾调用:

public override bool IsSubclassOf(Type c)
{
    throw new NotSupportedException();
}

通过this行:

 public virtual bool IsEnum {
     get
     {
        return IsSubclassOf(RuntimeType.EnumType);
     }
this行调用的

internal static ParameterExpression Make(Type type, string name, bool isByRef) {
    if (isByRef) {
        return new ByRefParameterExpression(type, name);
    } else {
        if (!type.IsEnum) {

现在...关于您的问题:不能做。不幸的是,这两个子系统(Reflection.EmitExpression)并没有太多的“兼容”。如您所知,不支持使用LambaExpression.CompileToMethod()创建实例方法(包括构造函数)。您唯一可以做的就是创建普通的(非泛型)静态方法,该方法不包含在其参数中使用TypeBuilder构建的类型。