是否可以获取指向装箱的非托管值类型的指针



是否可以获得指向盒装非托管值类型的指针,而不必编写为每个支持的类型进行强制转换的大型switch语句?类似于:

object val;         // Contains a boxed unmanaged value, such as int, long, byte, etc.
void* ptr = &val;   // Obviously does not compile
DoStuffWithPointer(ptr);

而不是

object val;   // Contains a boxed unmanaged value, such as int, long, byte etc.
if (val.GetType() == typeof(byte)) 
{
var typedValue = (byte)value;
DoStuffWithPointer(&typedValue);
}
else if (val.GetType() == typeof(short)) 
{
var typedValue = (short)value;
DoStuffWithPointer(&typedValue);
}
else 
// ... and so on

Btw。我知道指针指向堆栈上的一个局部变量,一旦函数返回,指针就会失效。没关系。

您可以使用ref T Unsafe.Unbox<T>(object)获取指向装箱值的托管指针(ref T(。将非托管指针(T*(获取到装箱值实际上是GC的竞争,除非您已经用GCHandle固定了装箱,并且可以用T* Unsafe.AsPointer<T>(ref T)完成。

(!(仔细阅读关于Unsafe.Unbox的备注部分:不允许直接更改包含的值(只能调用其上的属性/方法(,如果需要更改值,请使用类似StrongBox<T>的类。


Btw。我知道指针指向堆栈上的一个局部变量,一旦函数返回,指针就会失效。没关系。

看起来你可以从一个盒子处理到另一个堆栈,然后你可以使用良心切换语法

switch (val)
{
case int typedValue: DoStuffWithPointer(&typedValue); break;
case byte typedValue: DoStuffWithPointer(&typedValue); break;
//...
}

最新更新