Реализовать Stream.CopyTo() для .NET 3.5 - C#
Формулировка задачи:
В связи с тем, что приходится вести проект на платформе .NET Framework 3.5 возникает необходимость в новых методах, реализующие расширение функциональности системных классов. Причём подсматривать эту реализацию можно через .NET Reflector в уже реализованных методах на платформе .NET Framework 4.0.
Вот и сейчас при подключении к своей программе специализированной библиотеки для парсинга особым образом кодированной структуры AndroidXml возникает ошибка:Error CS0103 The name 'CopyTo' does not exist in the current context AndroidXml
Эта ошибка возникает из-за того, что в используемой в моём проекте версии платформы .NET Framrwork 3.5 нет ещё реализации серии методов CopyTo(), которые добавлены в версии .NET Framrwork 4.0. Эту проблему я думаю решить при помощи самостоятельной реализации этого метода, подсмотрев его реализацию через .NET Reflector в соответствующей библиотеке платформы .NET Framrwork 4.0. Там он находится в классе Stream пространства имён System.IO из файла mscorlib.dll. Для реализации этой задачи я создала класс ExtentionMethods, в который я поместила реализацию 2-х методов:1. Реализацию необходимого мне метода CopyTo()
public void CopyTo(Stream destination)
2. Реализацию вспомогательного метода InternalCopyTo(), который вызывается из предыдущего метода.
private void InternalCopyTo(Stream destination, int bufferSize)
Полная реализация этих методов, подсмотренная в .NET Reflector выглядит следующим образом.
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Globalization; namespace ExtentionMethods { class ExtentionMethods { public void CopyTo(Stream destination) { if (destination == null) { throw new ArgumentNullException("destination"); } if (!this.CanRead && !this.CanWrite) { throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_StreamClosed")); } if (!destination.CanRead && !destination.CanWrite) { throw new ObjectDisposedException("destination", Environment.GetResourceString("ObjectDisposed_StreamClosed")); } if (!this.CanRead) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnreadableStream")); } if (!destination.CanWrite) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnwritableStream")); } this.InternalCopyTo(destination, 0x14000); } private void InternalCopyTo(Stream destination, int bufferSize) { int num; byte[] buffer = new byte[bufferSize]; while ((num = this.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, num); } } } }
В исходном классе Stream - это было ясно и понятно, но как мне вызывать экземпляр этого класса в моём случае? Помогите, пожалуйста, мне понять каким образом, нужно изменить программный код (см. выше), чтобы я могла расширить класс Stream методом CopyTo() для платформы .NET Framework 3.5, используя приведенный выше код из версии платформы .NET Framework 4.0.
Заранее благодарю за помощь.Решение задачи: «Реализовать Stream.CopyTo() для .NET 3.5»
static class ExtentionMethods { public static void CopyTo(this Stream srcStream, Stream destination) { if (destination == null) { throw new ArgumentNullException("destination"); } if (!srcStream.CanRead && !srcStream.CanWrite) { throw new ObjectDisposedException(null); //, Environment.GetResourceString("ObjectDisposed_StreamClosed")); } if (!destination.CanRead && !destination.CanWrite) { throw new ObjectDisposedException("destination");//, Environment.GetResourceString("ObjectDisposed_StreamClosed")); } if (!srcStream.CanRead) { throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnreadableStream")); } if (!destination.CanWrite) { throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnwritableStream")); } InternalCopyTo(srcStream, destination, 0x14000); } private static void InternalCopyTo(Stream srcStream, Stream destination, int bufferSize) { int num; byte[] buffer = new byte[bufferSize]; while ((num = srcStream.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, num); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д