Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐藏C#和#x27的实现;使用';s的论点_C#_Using Statement - Fatal编程技术网

隐藏C#和#x27的实现;使用';s的论点

隐藏C#和#x27的实现;使用';s的论点,c#,using-statement,C#,Using Statement,我试图抽象与本机代码共享的数据的结构(实际上是类,所以它是引用类型)之间的封送处理IntPtr 我有一个助手类: class NativeStruct<StructType> : IDisposable { public NativeStruct() { _DataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(StructType))); Marshal.PtrToStructure(

我试图抽象与本机代码共享的数据的结构(实际上是类,所以它是引用类型)之间的封送处理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;
}
在C++中,我会用到一个类似于

的宏
#define EditStruct(StructType, IntPtr) using  \
(Shared_s data = new Toolbox.NativeStruct<StructType>(IntPtr).data)
#使用\
(共享的数据=新的Toolbox.NativeStruct(IntPtr.data)

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

EditStruct<DataStruct>(myIntPtr, data =>
{
    data.someMember = someValue;
}); 
C#2.0版本:

EditStruct<DataStruct>(myIntPtr, delegate(DataStruct data)
{
    data.someMember = someValue;
});

void EditStruct<TStruct(IntPtr dataPtr, Action<StructType> action) where TStruct : struct
{
    using (Toolbox.NativeStruct<StructType> s = new Toolbox.NativeStruct<StructType>(dataPtr))
    {
        action(s.Data);
    }
}
EditStruct(myIntPtr,委托(DataStruct数据)
{
data.someMember=someValue;
});

void editstruct看起来比using语句更好,但是,我不知道如何实现。这就是实现。
data=>{…}
被转换为方法的委托,该委托在
EditStruct()
@Xaade I中被称为
action(data)
,该委托通过该路径一次。在大多数情况下,我都会使用香草。就语法而言,这对于嵌套代码IMOHO来说是一场噩梦。哦,所以操作作为参数传递给lambda。。。。哈哈。现在它有了意义。数据(
DataStruct
instance)作为参数传递给lambda,是的。
EditStruct<DataStruct>(myIntPtr, data =>
{
    data.someMember = someValue;
}); 
void EditStruct<TStruct>(IntPtr dataPtr, Action<TStruct> action) 
     where TStruct : struct
{
   using (var s = new Toolbox.NativeStruct<TStruct>(dataPtr))
   {
     action(s.Data);
   }
}
EditStruct<DataStruct>(myIntPtr, delegate(DataStruct data)
{
    data.someMember = someValue;
});

void EditStruct<TStruct(IntPtr dataPtr, Action<StructType> action) where TStruct : struct
{
    using (Toolbox.NativeStruct<StructType> s = new Toolbox.NativeStruct<StructType>(dataPtr))
    {
        action(s.Data);
    }
}