2013-06-19 4 views
2

Мой метод получает параметр MemoryStream в качестве параметра. Как узнать, расширяется ли эта MemoryStream?Как определить, установлен ли размер памяти MemoryStream?

MemoryStream может быть создан с использованием массива с использованием «нового MemoryStream (byte [] buf)». Это означает, что поток будет иметь фиксированный размер. Вы не можете добавлять к нему данные. С другой стороны, поток может быть создан без параметров с помощью «new MemoryStream()». В этом случае вы можете добавить к нему данные.

Вопрос: Как я могу знать - могу ли я безопасно добавлять данные в текущий поток или я должен создать новый расширяемый поток и скопировать данные на него?

+0

Вы пробовали свойство CanWrite? Различия между этими случаями? – chris

+0

Без лишнего контекста я бы сказал, что вы не должны пытаться. Если вызывающий абонент передает поток, который не может принимать данные, они не должны вызывать операции, которые могут привести к записи данных. То есть, возможно, вы можете улучшить интерфейс класса, чтобы это не проблема. – bmm6o

+0

Он всегда МОЖЕТ принимать данные. Вы можете написать что-нибудь в поток, но доступный буфер - FIXED. Вы не можете ни писать за пределами буфера, ни расширять его емкость –

ответ

1

Вы можете сделать это с помощью отражения:

static bool IsExpandable(MemoryStream stream) 
{ 
    return (bool)typeof(MemoryStream) 
     .GetField("_expandable", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) 
     .GetValue(stream); 
} 

Я не знаю, если есть пылесос/безопасный способ получить эту информацию.

+0

Хорошее решение :) Но используйте Reflection для такой простой задачи ... Думаю, я просто ошибаюсь и не нуждаюсь в каких-либо решениях этого вопроса;) I должен держать его простым, глупым. –

0

На самом деле это не фиксированный размер, который лучше определяется как «не расширяемый», поскольку он все равно может быть усечен с помощью SetLength, но в любом случае ... Наверное, самое лучшее, что вы можете сделать, - это всегда использовать расширяемый поток , или если вы не контролируете этот аспект кода ... Возможно, попытайтесь поймать попытку расширения потока, и если он не сработает, скопируйте его в поток, доступный для записи, и повторите вызов метода снова?

 Смежные вопросы

  • Нет связанных вопросов^_^