Bir arabelleğe bir akış okuyan ve verilen yapıya yükleyen bu iki işlevi kullanıyorum.Bu yapı işlevleri nasıl genel yapılır?
TestStruct1 ReadRecFromStream2(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct1))];
stream.Read(buffer, 0, 128);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (TestStruct1)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct1));
}
finally
{
handle.Free();
}
}
TestStruct2 ReadRecFromStream(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct2))];
stream.Read(buffer, 0, 128);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (TestStruct2)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct2));
}
finally
{
handle.Free();
}
}
Ben yapılar birini almak için jenerik fonksiyonu içine bu birleştirmek istiyorum
, düzgün bir yol budur ne yapacağını sadece emin değilim.
Bu doğru yol mu?
private T ReadRecFromStream<T>(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
stream.Read(buffer, 0, HeaderSize);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally
{
handle.Free();
}
}
Bu oldukça iyi bir kod gibi görünüyor, – Gelootn
Tamam, teşekkürler. Birisi bana yaptığım jenerik versiyonun yanlış olduğunu, ancak neden/nasıl yanlış olduğuna dair herhangi bir fikir vermediğini söyledi. Figürlü ben burada rica ediyorum. Teşekkürler! – pfinferno
Muhtemelen 'HeaderSize' parametresini bir parametre olarak geçirmelisiniz ... Tüm T. – xanatos