2011-09-08 44 views
3

我想抽象編組IntPtr從結構(實際上是類,所以它是引用類型)與本機代碼共享數據。隱藏C#實現使用的參數

我有這樣的輔助類:

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) 

回答

6

,你可以在這裏做的最接近的事是使用lambda表達式:

定義的 EditStruct()
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); 
    } 
} 
+0

這看起來比更好然而,使用聲明,我不知道如何實現。 –

+0

這就是實現。 'data => {...}'被轉換成一個委託給一個方法,在'EditStruct()'中被稱爲'action(data)'。 –

+0

@Xaade我「走過」這條路線一次。我已經在大多數情況下使用了香草。語法明智,這是嵌套代碼IMOHO的噩夢。 – 2011-09-08 19:26:47

0

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); 
    } 
}