代码之家  ›  专栏  ›  技术社区  ›  Odrade

C#:通过反射检索和使用IntPtr*

  •  2
  • Odrade  · 技术社区  · 17 年前

    以下是我要做的:

    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()的签名以接受对象,因为这样我就无法执行所需的指针操作。显然,我也不能从object转换到IntPtr*。

    有什么方法可以解决这个问题?

    2 回复  |  直到 17 年前
        1
  •  1
  •   JaredPar    17 年前

    虽然您可能无法从Object强制转换为IntPtr*,但您可以强制转换为IntPtr。记得, IntPtr* 只是一个指针。所以你可以找到第一个指针然后把它投回去。

    var ptr1 = (IntPtr)(fi.GetValue(theStruct));
    var ptr2 = (IntPtr*)(ptr1);
    
        2
  •  0
  •   Stan R.    17 年前

    要添加到JaredPar的答案中,请看一下.NET中的Marshal类,它可能有很多有用的特性。

    MSDN Link