मेरे पास इन दो कार्य हैं जो एक बफर में एक स्ट्रीम पढ़ते हैं और इसे दिए गए ढांचे में लोड करते हैं।इन संरचनाओं को सामान्य कैसे बनाएं?
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();
}
}
मैं structs के दोनों लेने के लिए एक सामान्य समारोह में इन संयोजित करना चाहते हैं, मैं सिर्फ उचित तरीके से यह है कि क्या करना है अनिश्चित हूँ।
क्या यह सही तरीका है?
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();
}
}
यह बहुत अच्छा कोड लगता है, – Gelootn
ठीक है, धन्यवाद। किसी ने मुझे व्यक्तिगत रूप से बताया कि मैंने जो सामान्य संस्करण बनाया है वह गलत था, लेकिन इस बारे में कोई अंतर्दृष्टि नहीं दी कि यह गलत क्यों था। चित्रित मैं यहां पूछूंगा। धन्यवाद! – pfinferno
शायद आपको 'हेडरसाइज' को पैरामीटर के रूप में पास करना चाहिए ... जब तक यह सभी टी – xanatos