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)
你可以在这里做的最接近的事情是使用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)
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |