2011-11-28 111 views
6

我的代码是这样的:C#铸造的MemoryStream对FILESTREAM

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

后来我使用file.Name。

我得到一个InvalidCastException:它会显示如下

无法转换类型“System.IO.MemoryStream”的对象键入“System.IO.FileStream”。

我在某处读到我应该将FileStream更改为Stream。有什么我应该做的吗?

+3

这种方法是错误的。你想达到什么目的? – Snowbear

+4

目前还不清楚你想要做什么。一个'MemoryStream'绝对不能转换为'FileStream',并且当你可以转换为'Stream'时,该类没有'.Name'属性。你想要做什么?你以后哪个名字? –

回答

16

A MemoryStream与文件没有关联,并且没有文件名的概念。基本上,你不能那样做。

你当然不能在它们之间施放;你只能向下倾斜 - 而不是侧身;可视化:

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

您可以通过投下MemoryStreamStream平凡和StreamMemoryStream类型检查;但从来没有FileStreamMemoryStream。这就像说狗是动物,而大象是动物,所以我们可以把狗给大象。

可以MemoryStream并添加Name属性(您提供一个值),但仍然会有一个FileStreamYourCustomMemoryStreamFileStream之间没有共性没有实现预先存在的接口得到一个Name;因此呼叫者必须分别处理明确或使用鸭子键入(也许通过dynamic或反射)。

另一种选择(可能更简单)可能是:将数据写入临时文件;从那里使用FileStream;然后(稍后)删除该文件。

3

该操作是不可能的。 FileStreamMemoryStream都直接来自Stream,所以它们是兄弟类型。通常,在以下情况下:

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

无法将B投射到C或反之亦然。 B和C之间没有“is-a”关系。

4

您可以比较Stream与动物,MemoryStream与狗和FileStream与猫。虽然狗是动物,猫是动物,但狗当然不是猫。

如果您想将数据从一个数据流复制到另一个数据流,则需要创建两个数据流,从一个数据流读取数据并写入另一个数据流。