2013-06-19 2 views
2

내 메서드는 매개 변수로 MemoryStream을 가져옵니다. 이 MemoryStream이 확장 가능한지 어떻게 알 수 있습니까?MemoryStream이 고정 크기인지 확인하는 방법은 무엇입니까?

MemoryStream은 "new MemoryStream (byte [] buf)"을 사용하여 배열을 사용하여 만들 수 있습니다. 즉, 스트림의 크기는 고정되어 있습니다. 데이터에 데이터를 추가 할 수 없습니다. 한편, "new MemoryStream()"을 사용하여 매개 변수없이 스트림을 만들 수 있습니다. 이 경우 데이터를 추가 할 수 있습니다.

질문 : 어떻게 알 수 있습니까? 현재 스트림에 안전하게 데이터를 추가 할 수 있습니까 아니면 새로운 확장 가능 스트림을 만들어 데이터를 복사해야합니까?

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

이 정보를 검색 할 수있는 청소기/안전한 방법이 있는지 모르겠어요 :

+0

CanWrite 속성을 사용해 보셨습니까? 그 경우를 구별합니까? – chris

+0

더 이상의 컨텍스트가 없으면 시도해서는 안됩니다. 호출자가 데이터를 수락 할 수없는 스트림을 전달하면 데이터를 쓰는 작업을 호출해서는 안됩니다. 즉, 클래스의 인터페이스를 향상시켜 문제가되지 않을 수도 있습니다. – bmm6o

+0

항상 데이터를 받아 들일 수 있습니다. 스트림에 무엇이든 쓸 수 있지만 사용 가능한 버퍼는 고정되어 있습니다. 버퍼 외부에 글을 쓸 수없고 용량을 늘릴 수도 없다. –

답변

1

당신은 그 사용하여 반사를 할 수 있습니다.

+0

멋진 솔루션 :) 그런 단순한 작업을 위해 리플렉션을 사용한다 ... 나는 단지 잘못된 방향으로 가고 있으며이 질문에 대한 해결책이 필요 없다고 생각한다.) 그것을 간단하게 유지해야한다. 어리 석다. –

0

사실 고정 된 크기가 아니기 때문에 SetLength를 통해 여전히 잘릴 수 있기 때문에 "확장 불가능"으로 정의하는 것이 좋습니다.하지만 어쨌든 ... 아마도 가장 좋은 방법은 항상 확장 가능한 스트림을 사용하는 것입니다 , 또는 코드의 해당 부분을 제어하지 않으면 ... 아마도 스트림을 확장하려는 시도를 잡으십시오. 실패한 경우 쓰기 가능한 스트림으로 복사하고 재귀 적으로 메서드를 다시 호출할까요?