Reflection 如何确定ConstructorInfo对象是否具有非托管参数?

Reflection 如何确定ConstructorInfo对象是否具有非托管参数?,reflection,c++-cli,unmanaged,Reflection,C++ Cli,Unmanaged,我的应用程序使用反射在运行时分析c++/cli代码。 我需要确定类型是否具有没有非托管参数(指针等)的构造函数,因为我希望稍后使用: ConstructorInfo constructorInfo; // ... var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null); 如果构造函数有一个指向非托管对象的指针作为参数,则当我向其传递null时会出现强制转换异常 那么我该如何确定呢?这里没

我的应用程序使用反射在运行时分析c++/cli代码。
我需要确定类型是否具有没有非托管参数(指针等)的构造函数,因为我希望稍后使用:

ConstructorInfo constructorInfo;  
// ...  
var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null);  
如果构造函数有一个指向非托管对象的指针作为参数,则当我向其传递null时会出现强制转换异常


那么我该如何确定呢?这里没有被管理的。。。在这种情况下,iPointer没有帮助。

尝试测试参数是否为值类型
null
对于任何值类型都不是有效的值,无论是非托管指针还是简单的
int
不清楚您的实际问题是什么,但下面是一个简短的演示程序,它显示了将
null
传递给构造函数,该构造函数将指针作为参数,并使用
IsPointer
检测它:

using System;
using System.Reflection;

namespace pointers
{
    unsafe class Program
    {
        public Program(int* x)
        {
            Console.WriteLine("It worked!");
        }

        static void Main(string[] args)
        {
            ConstructorInfo[] c = typeof(Program).GetConstructors();
            c[0].Invoke(BindingFlags.Default, null, new object[] { null }, null);
            Console.WriteLine(c[0].GetParameters()[0].ParameterType.IsPointer);
        }
    }
}
它打印: 成功了!
True

为什么
IsPointer
不提供帮助?因为对于IsPointer(即数组),许多其他托管对象将返回True。对于
IsPointer
,指向数组的指针将返回True。此外,C++数组被表示为指针,因此指向对象的指针和对象数组基本上是相同的。但在.NET中,这些都不是实际的数组类型Console.WriteLine(typeof(int*).IsValueType)打印
False
,因此运行时不认为指针是值类型。特别是,它们不是从
System.ValueType
@Gabe:.NET派生的。NET用
System::IntPtr
表示非托管指针,我相信它确实派生自
System::ValueType
。非托管指针可以在
IntPtr
之间来回转换,但指针在CTS中有自己的表示形式。CLR规范(ECMA335Partition I)的第8节明确指出,指针是引用类型(但不是对象)。请参见图1、第8.2.1节和第8.9.2节了解明确的地方。请参见问题注释。。。IsPointer确实返回True,但对于其他托管类型,我需要一个测试,该测试将为非托管类型返回True,为任何其他类型返回false。谢谢@塞尔达里:如果你认为有一种非指针类型的
IsPointer
返回True,请告诉我它是什么。但我仍然不清楚为什么不能为实际指针传递
null
。 It worked! True