从非托管内存返回通用引用

时间:2018-11-28 09:14:55

标签: c# reference value-type unmanaged-memory

我有一个通用类

class UnmanagedArray<T> where T: struct 
{
    IntPtr _backing; // unmanaged memory

    // some constructors and others methods

    // very slow but I don't care
    public T this[int index] 
    {
        get 
        {
            int elementSize = Marshal.SizeOf(default(T));       
            byte* ptr = ((byte*)tab) + index * elementSize;         
            T result = default(T);      
            var handle = GCHandle.Alloc(result, GCHandleType.Pinned);       
            byte* result_ptr = (byte*) handle.AddrOfPinnedObject();           
            for(int k = 0; k < elementSize; ++k)        
            {
                result_ptr[k] = ptr[k];         
            }
            handle.Free();      
            return result;
        } 
    } 

}

现在,我想修改数组中的元素。 像

myArray[i].prop = 12;

我不能这样做,因为

  

无法修改Array.this [int]的返回值,因为它是   不是变量。

我完全理解该错误,因为T是一个ValueType,因此是不可变的(由副本返回)。

有什么方法可以在我的索引器属性中制作一个ref return

PS:T不能是引用类型。它必须是一个ValueType。

0 个答案:

没有答案