2011-11-28 6 views
6

Il mio codice è questo:C# Casting MemoryStream per FileStream

byte[] byteArray = Encoding.ASCII.GetBytes(someText); 
MemoryStream stream = new MemoryStream(byteArray); 
StreamReader reader = new StreamReader(stream); 
FileStream file = (FileStream)reader.BaseStream; 

tardi sto usando file.Name.

Ricevo un InvalidCastException: visualizza segue

Impossibile eseguire il cast oggetto di tipo 'System.IO.MemoryStream' digitare 'System.IO.FileStream'.

Ho letto da qualche parte che dovrei solo cambiare FileStream in Stream. C'è qualcos'altro che dovrei fare?

+3

Questo approccio è sbagliato. Cosa stai cercando di ottenere? – Snowbear

+4

Non è chiaro cosa vuoi fare. Un 'MemoryStream' non può essere gettato su un' FileStream', e mentre è possibile eseguire il cast su 'Stream', quella classe non ha una proprietà' .Name'. Che cosa stai cercando di fare? Quale nome stai cercando? –

risposta

16

A MemoryStream non è associato a un file e non ha alcun concetto di nome file. Fondamentalmente, non puoi farlo.

Non si può certamente castare tra loro; puoi solo lanciare verso l'alto un verso il basso - non di lato; di visualizzare:

 Stream 
      | 
    --------------- 
    |    | 
FileStream MemoryStream 

si può lanciare un MemoryStream ad un Stream banalmente, e un Stream ad un MemoryStream attraverso un tipo-check; ma mai uno FileStream a MemoryStream. È come dire che un cane è un animale, e un elefante è un animale, quindi possiamo lanciare un cane a un elefante.

Si potrebbe sottoclasse MemoryStream e aggiunge una proprietà Name (che si fornisce un valore per), ma ci sarebbe ancora nessuna comunanza tra un FileStream e un YourCustomMemoryStream, e FileStream non implementa un'interfaccia preesistente a prendi un Name; quindi il chiamante dovrebbe esplicitamente gestire entrambi separatamente oppure utilizzare la digitazione anatra (forse tramite dynamic o riflessione).

Un'altra opzione (forse più semplice) potrebbe essere: scrivere i dati in un file temporaneo; utilizzare un FileStream da lì; poi (più tardi) cancella il file.

3

Questa operazione non è possibile. Entrambi FileStream e MemoryStream derivano direttamente da Stream, quindi sono tipi fratelli. In generale, nelle seguenti condizioni:

public class A { } 
public class B : A { } 
public class C : A { } 

Non è possibile colare B a C o viceversa. Non esiste una relazione "is-a" tra B e C.

4

È possibile confrontare Stream con animale, MemoryStream con cane e FileStream con cat. Sebbene un cane sia un animale e un gatto sia un animale, un cane non è certamente un gatto.

Se si desidera copiare i dati da uno stream a un altro, sarà necessario creare entrambi i flussi, leggere da uno e scrivere sull'altro.