Reflection 如何确定ConstructorInfo对象是否具有非托管参数?
我的应用程序使用反射在运行时分析c++/cli代码。Reflection 如何确定ConstructorInfo对象是否具有非托管参数?,reflection,c++-cli,unmanaged,Reflection,C++ Cli,Unmanaged,我的应用程序使用反射在运行时分析c++/cli代码。 我需要确定类型是否具有没有非托管参数(指针等)的构造函数,因为我希望稍后使用: ConstructorInfo constructorInfo; // ... var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null); 如果构造函数有一个指向非托管对象的指针作为参数,则当我向其传递null时会出现强制转换异常 那么我该如何确定呢?这里没
我需要确定类型是否具有没有非托管参数(指针等)的构造函数,因为我希望稍后使用:
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中,这些都不是实际的数组类型所以任何指针都可以为空。@Gabe:所有指针都是值类型。指针的空值不同于对象引用,这听起来像@seldary正在传递。或者至少这是我对这个问题的理解……它们在技术上可能是值,但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