隐藏C#'使用参数的实现

Lee*_*ere 3 c# using-statement

我正在尝试从与本机代码共享的数据的结构(实际上是类,因此它的引用类型)中抽象编组IntPtr.

我有这个助手类:

class NativeStruct<StructType> : IDisposable
{
    public NativeStruct()
    {
        _DataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(StructType)));
        Marshal.PtrToStructure(_DataPtr, _Data);
    }
    public NativeStruct(IntPtr dataPtr)
    {
        _DataPtr = dataPtr;
        Marshal.PtrToStructure(_DataPtr, _Data);
    }

    void IDisposable.Dispose()
    {
        Marshal.StructureToPtr(_Data, _DataPtr, true);
    }

    public StructType Data { get { return _Data; } }

    IntPtr _DataPtr;
    public StructType _Data;
}
Run Code Online (Sandbox Code Playgroud)

无论如何都有隐含的代码:

using (Shared_s data = new Toolbox.NativeStruct<DataStruct>(myIntPtr).Data)
{
    data.someMember = someValue;
}
Run Code Online (Sandbox Code Playgroud)

一些方法来改变它

EditStruct(DataStruct, myIntPtr)
{
    data.someMember = someValue;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,我会使用像

#define EditStruct(StructType, IntPtr) using  \
(Shared_s data = new Toolbox.NativeStruct<StructType>(IntPtr).data)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ade 6

你可以在这里做的最接近的事情是使用lambda表达式:

EditStruct<DataStruct>(myIntPtr, data =>
{
    data.someMember = someValue;
}); 
Run Code Online (Sandbox Code Playgroud)

定义EditStruct():

void EditStruct<TStruct>(IntPtr dataPtr, Action<TStruct> action) 
     where TStruct : struct
{
   using (var s = new Toolbox.NativeStruct<TStruct>(dataPtr))
   {
     action(s.Data);
   }
}
Run Code Online (Sandbox Code Playgroud)