Разве дерево выражений не поддерживает динамические параметры универсального типа? - PullRequest
0 голосов
/ 24 июня 2018

Я хотел бы динамически создавать универсальные классы.Чтобы определить параметры типа, вы вызовете метод DefineGenericParameters для TypeBuilder s и можете добавить ограничения типа для параметров типа с возвращаемым значением.

Кстати, я использую дерево выражений для генерациитело метода.Но затем я понял, что API-интерфейсы дерева выражений не принимают GenericTypeParameterBuilder s, что является возвращаемым значением метода DefineGenericParameters, в качестве аргументов.
Может быть, вам интересно, будет ли он компилироваться.Поскольку тип является производным от Type, он будет компилироваться.Но API дерева выражений генерируют исключения во время выполнения, сообщая мне, что тип содержит параметр универсального типа в Mono и что этот метод не поддерживается в .NET.

Так что мне кажется, что дерево выражений может 'Обработка параметров универсального типа, но так ли это на самом деле?Я что-то упустил?
Если это так, я буду рад, если вы предложите другие способы обработки параметров универсального типа с помощью дерева выражений.

1 Ответ

0 голосов
/ 24 июня 2018

метод не поддерживается в .NET.

Это я могу объяснить:

Чтобы проверить, является ли тип перечислением, в конце эта строка называется:

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

эта строка:

 public virtual bool IsEnum {
     get
     {
        return IsSubclassOf(RuntimeType.EnumType);
     }

, которая вызывается этой строкой:

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

Сейчас ... О вашем вопросе: не могу сделать.К сожалению, две подсистемы (Reflection.Emit и Expression) не очень "совместимы".Как вы знаете, создание методов экземпляров (включая конструкторы) с LambaExpression.CompileToMethod() не поддерживается.Единственное, что вы можете сделать, - это создать простые (неуниверсальные) статические методы, которые не включают тип, создаваемый с TypeBuilder, в свои параметры.

...