Реализовать 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);
            }
        }
    }
}
При запуске этого программного кода возникает проблема, связанная с тем, что в этих методах в свою очередь вызываются внутренние свойства и методы на экземпляре класса this.

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

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

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

textual
Листинг программы
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);
        }
    }
}

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


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

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

8   голосов , оценка 4 из 5
Похожие ответы