Bur*_*rst 1 .net c# generics reflection
有人可以解释为什么我看到我所看到的(下面控制台的屏幕截图)?对于 'ref' 和非 'ref' 方法参数,我从 Reflection 获得了不同的泛型相关属性。我正在使用 .NET 4.8(经典的 .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);
    }
}
作为备注的IsGenericType说:
如果立即数类型不是泛型,则该
IsGenericType属性返回false。例如,元素类型为A<int>(A(Of Integer)在 Visual Basic 中)的数组本身不是泛型类型。
如果batchlist是 aList<MyClass>[]或指针,你会发现你得到相同的结果。
如果您有一个 by-ref 类型,则需要调用GetElementType()以获取基础类型。这给了你typeof(List<MyClass>),它的行为与你期望的一样。