Реализовать 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()

Листинг программы
  1. public void CopyTo(Stream destination)

2. Реализацию вспомогательного метода InternalCopyTo(), который вызывается из предыдущего метода.

Листинг программы
  1. private void InternalCopyTo(Stream destination, int bufferSize)

Полная реализация этих методов, подсмотренная в .NET Reflector выглядит следующим образом.

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Diagnostics;
  8. using System.Globalization;
  9. namespace ExtentionMethods
  10. {
  11. class ExtentionMethods
  12. {
  13. public void CopyTo(Stream destination)
  14. {
  15. if (destination == null)
  16. {
  17. throw new ArgumentNullException("destination");
  18. }
  19. if (!this.CanRead && !this.CanWrite)
  20. {
  21. throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
  22. }
  23. if (!destination.CanRead && !destination.CanWrite)
  24. {
  25. throw new ObjectDisposedException("destination", Environment.GetResourceString("ObjectDisposed_StreamClosed"));
  26. }
  27. if (!this.CanRead)
  28. {
  29. throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnreadableStream"));
  30. }
  31. if (!destination.CanWrite)
  32. {
  33. throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnwritableStream"));
  34. }
  35. this.InternalCopyTo(destination, 0x14000);
  36. }
  37. private void InternalCopyTo(Stream destination, int bufferSize)
  38. {
  39. int num;
  40. byte[] buffer = new byte[bufferSize];
  41. while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
  42. {
  43. destination.Write(buffer, 0, num);
  44. }
  45. }
  46. }
  47. }
При запуске этого программного кода возникает проблема, связанная с тем, что в этих методах в свою очередь вызываются внутренние свойства и методы на экземпляре класса this.

В исходном классе Stream - это было ясно и понятно, но как мне вызывать экземпляр этого класса в моём случае? Помогите, пожалуйста, мне понять каким образом, нужно изменить программный код (см. выше), чтобы я могла расширить класс Stream методом CopyTo() для платформы .NET Framework 3.5, используя приведенный выше код из версии платформы .NET Framework 4.0.

Заранее благодарю за помощь.

Решение задачи: «Реализовать Stream.CopyTo() для .NET 3.5»

textual
Листинг программы
  1. static class ExtentionMethods
  2. {        
  3.     public static void CopyTo(this Stream srcStream, Stream destination)
  4.     {
  5.         if (destination == null)
  6.         {
  7.             throw new ArgumentNullException("destination");
  8.         }
  9.         if (!srcStream.CanRead && !srcStream.CanWrite)
  10.         {
  11.             throw new ObjectDisposedException(null); //, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
  12.         }
  13.         if (!destination.CanRead && !destination.CanWrite)
  14.         {
  15.             throw new ObjectDisposedException("destination");//, Environment.GetResourceString("ObjectDisposed_StreamClosed"));
  16.         }
  17.         if (!srcStream.CanRead)
  18.         {
  19.             throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnreadableStream"));
  20.         }
  21.         if (!destination.CanWrite)
  22.         {
  23.             throw new NotSupportedException(); //Environment.GetResourceString("NotSupported_UnwritableStream"));
  24.         }
  25.         InternalCopyTo(srcStream, destination, 0x14000);
  26.     }
  27.  
  28.     private static void InternalCopyTo(Stream srcStream, Stream destination, int bufferSize)
  29.     {
  30.         int num;
  31.         byte[] buffer = new byte[bufferSize];
  32.         while ((num = srcStream.Read(buffer, 0, buffer.Length)) != 0)
  33.         {
  34.             destination.Write(buffer, 0, num);
  35.         }
  36.     }
  37. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы