2009-07-14 27 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