2009-07-14 29 views
2

我目前正在研究一些代码,它反映了从调用返回到本机dll的结构。一些结构包含IntPtr *字段,这些字段指向以null结尾的指针数组。这些字段需要特殊处理。在反思结构时,我可以识别这些字段,因为它们由自定义属性标记。C#:通过反射检索和使用IntPtr *

下面举例说明什么,我试图做的:

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 *。

有什么技术可以解决这个问题?

回答

1

虽然您可能无法从Object转换为IntPtr *,但您可以将其转换为IntPtr。请记住,IntPtr*只是一个指针指针。所以你可以到达第一个指针,然后将其转回。

var ptr1 = (IntPtr)(fi.GetValue(theStruct)); 
var ptr2 = (IntPtr*)(ptr1); 
+0

我不是这方面的专家,但我想你可能需要使用不安全{} here..right? – 2009-07-14 15:19:50

0

要添加到JaredPar的答案,请看看.NET中的Marshal类,它可能会为您提供很多有用的功能。

MSDN Link