我的代码是:
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。我还需要做些什么吗?
MemoryStream
不与文件关联,也没有文件名的概念。基本上,你不能那样做。
你当然不能在它们之间转换;你只能向上或向下投,而不能向旁边投;想象:
Stream
|
---------------
| |
FileStream MemoryStream
可以简单地将MemoryStream
转换为Stream
,通过类型检查将Stream
转换为MemoryStream
;但从来没有FileStream
到MemoryStream
。这就像说狗是一种动物,大象也是一种动物,所以我们可以把狗扔给大象。
您可以子类MemoryStream
并添加Name
属性(您为其提供值),但FileStream
和YourCustomMemoryStream
之间仍然没有共性,并且FileStream
没有实现预先存在的接口来获得Name
;所以调用者必须显式地分别处理两者,或者使用duck-typing(可能通过dynamic
或反射)。
另一个选项(可能更简单)可能是:将数据写入临时文件;从那里使用FileStream
;然后(稍后)删除文件
你可以将Stream
比作动物,MemoryStream
比作狗,FileStream
比作猫。虽然狗是一种动物,猫也是一种动物,但狗肯定不是猫。
如果你想把数据从一个流复制到另一个流,你需要创建两个流,从一个流读到另一个流写。
不允许此操作。FileStream
和MemoryStream
都直接派生自Stream
,因此它们是兄弟类型。通常,在以下场景中:
public class A { }
public class B : A { }
public class C : A { }
不可能将B强制转换为C,反之亦然。B和c之间不存在"是-是"关系。