我正在尝试将与 native 代码共享的数据的结构(实际上是类,因此它是引用类型)的编码 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;
}
有没有办法使这段代码隐式化:
using (Shared_s data = new Toolbox.NativeStruct<DataStruct>(myIntPtr).Data)
{
data.someMember = someValue;
}
一些方法可以将其更改为
EditStruct(DataStruct, myIntPtr)
{
data.someMember = someValue;
}
在 C++ 中我会使用像这样的宏
#define EditStruct(StructType, IntPtr) using \
(Shared_s data = new Toolbox.NativeStruct<StructType>(IntPtr).data)
最佳答案
您在这里可以做的最接近的事情是使用 lambda 表达式:
EditStruct<DataStruct>(myIntPtr, data =>
{
data.someMember = someValue;
});
EditStruct()
的定义:
void EditStruct<TStruct>(IntPtr dataPtr, Action<TStruct> action)
where TStruct : struct
{
using (var s = new Toolbox.NativeStruct<TStruct>(dataPtr))
{
action(s.Data);
}
}
关于c# - 隐藏 C# 'using' 参数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353276/