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