我目前正在处理一些代码,这些代码反映了从调用到本机dll的过程中编组的结构。一些结构包含IntPtr *字段,这些字段指向以Null结尾的指针数组。这些字段需要特殊处理。当反思结构时,我可以识别这些字段,因为它们由自定义属性标记。
以下说明了我正在尝试做的事情:
public void ProcessStruct(object theStruct)
{
foreach (FieldInfo fi in theStruct.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
{
if (fi.FieldType.IsPointer && IsNullTermArray(fi))
{
//Has the custom attribute, commence processing of
//IntPtr* pointing to null-terminated array
ProcessIntPtr(fi.GetValue(theStruct));
}
else{/*..Other Processing..*/ }
}
}
public void unsafe ProcessIntPtr(IntPtr* ptr)
{
//Iterate over the array and process the elements
//There are pointer operations here.
}
问题是
fi.GetValue(theStruct)
返回一个对象,我显然不能直接将其传递给ProcessIntPtr()。我无法将ProcessIntPtr()的签名更改为接受对象,因为那样我将无法执行所需的指针操作。显然,我也不能从对象转换为IntPtr *。
有哪些技术可以解决此问题?
最佳答案
虽然可能无法从Object强制转换为IntPtr *,但是可以强制转换为IntPtr。请记住,IntPtr*
只是一个指针指针。因此,您可以到达第一个指针,然后将其回退。
var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);