c# - 隐藏 C# 'using' 参数的实现

标签 c# using-statement

我正在尝试将与 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/

相关文章:

c# - HTTPS C# 发布?

c++ - 使用模板基类的模板函数声明

c# - 理解 using 语句

c# - 关于从使用 block 返回的最佳实践

c# - “使用”语句与 'try finally'

c# - Entity Framework 的“使用”关键字与类字段

c# - JIT 内联是否可以将我的代码内联到某些 .NET 运行时汇编代码中?

c# - 如何查看我的客户端应用程序发送的 SOAP 数据?

c# - Android 应用程序抛出 : Java. Lang.IllegalStateException,并显示消息:OnSaveInstanceState 后无法执行此操作

c# - 将文件传输到目的地时取消文件传输