В C# Relfection неправильно определяет свойство IsGenericType для аргумента метода ByRef - PullRequest
1 голос
/ 08 апреля 2020

Может кто-нибудь объяснить, почему я вижу то, что вижу (скриншот консоли ниже)? Для аргументов 'ref' и non-'ref 'метода я получил различные общие свойства c от Reflection. Я использую. NET 4.8 (classi c. NET Framework).

public class MyClass {

    public class Aref
    {
        public virtual void method(object je, ref List<MyClass> batchlist, object doc)
        {
        }
    }


    public class A
    {
        public virtual void method(object je, List<MyClass> batchlist, object doc)
        {
        }
    }

    private static void WriteGenericProps(Type type)
    {
        var method = type.GetMethod(nameof(Aref.method));
        var param = method.GetParameters().First(p => p.Name == "batchlist");

        Console.WriteLine(nameof(param.ParameterType.IsByRef) + "=" + param.ParameterType.IsByRef);
        Console.WriteLine(nameof(param.ParameterType.IsGenericType) + "=" + param.ParameterType.IsGenericType);
        Console.WriteLine(nameof(param.ParameterType.ContainsGenericParameters) + "=" + param.ParameterType.ContainsGenericParameters);
        Console.WriteLine(nameof(param.ParameterType.IsConstructedGenericType) + "=" + param.ParameterType.IsConstructedGenericType);
        Console.WriteLine(nameof(param.ParameterType.IsGenericParameter) + "=" + param.ParameterType.IsGenericParameter);
        Console.WriteLine(nameof(param.ParameterType.IsGenericTypeDefinition) + "=" + param.ParameterType.IsGenericTypeDefinition);
    }

    static void Main(string[] args)
    {
        var t = typeof(Aref);
        Console.WriteLine(t.Name);
        WriteGenericProps(t);
        Console.WriteLine();

        t = typeof(A);
        Console.WriteLine(t.Name);
        WriteGenericProps(t);
    }
}

enter image description here

1 Ответ

5 голосов
/ 08 апреля 2020

Как Замечания для IsGenericType говорят:

Свойство IsGenericType возвращает false, если непосредственный тип не является универсальным c. Например, массив, элементы которого имеют тип A<int> (A(Of Integer) в Visual Basi c), сам по себе не является универсальным типом c.

Вы обнаружите, что получаете тот же результат, если batchlist является List<MyClass>[] или указателем.

Если у вас есть тип by-ref, вам нужно вызвать GetElementType(), чтобы получить базовый тип. Это дает вам typeof(List<MyClass>), который ведет себя так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...