是否可以获得指向盒装非托管值类型的指针,而不必编写为每个支持的类型进行强制转换的大型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;
//...
}