隐藏C#和#x27的实现;使用';s的论点
我试图抽象与本机代码共享的数据的结构(实际上是类,所以它是引用类型)之间的封送处理IntPtr 我有一个助手类:隐藏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(
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);
}
}