我正在尝试与一个我无法控制的系统进行通信,但是其中一个方法需要一个HttpPostedFile在我的代码中,我有一个字节数组.有谁有一个例子来实例化一个HttpPostedFile,因为我知道它的构造函数是内部的?
我发现最好的是this SO post,它使用反射,但是他们被引导到另一个方向,我不能采取,因为我无法修改第三方系统方法签名.
解决方法
这真的是真的hacky代码,但以下似乎适用于我:
public HttpPostedFile ConstructHttpPostedFile(byte[] data,string filename,string contentType) { // Get the System.Web assembly reference Assembly systemWebAssembly = typeof (HttpPostedFileBase).Assembly; // Get the types of the two internal types we need Type typeHttpRawUploadedContent = systemWebAssembly.GetType("System.Web.HttpRawUploadedContent"); Type typeHttpInputStream = systemWebAssembly.GetType("System.Web.HttpInputStream"); // Prepare the signatures of the constructors we want. Type[] uploadedParams = { typeof(int),typeof(int) }; Type[] streamParams = {typeHttpRawUploadedContent,typeof (int),typeof (int)}; Type[] parameters = { typeof(string),typeof(string),typeHttpInputStream }; // Create an HttpRawUploadedContent instance object uploadedContent = typeHttpRawUploadedContent .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,null,uploadedParams,null) .Invoke(new object[]{data.Length,data.Length}); // Call the AddBytes method typeHttpRawUploadedContent .getmethod("AddBytes",BindingFlags.NonPublic | BindingFlags.Instance) .Invoke(uploadedContent,new object[] {data,data.Length}); // This is necessary if you will be using the returned content (ie to Save) typeHttpRawUploadedContent .getmethod("DoneAddingBytes",null); // Create an HttpInputStream instance object stream = (Stream)typeHttpInputStream .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,streamParams,null) .Invoke(new object[] {uploadedContent,data.Length}); // Create an HttpPostedFile instance HttpPostedFile postedFile = (HttpPostedFile)typeof(HttpPostedFile) .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,parameters,null) .Invoke(new object[] {filename,contentType,stream}); return postedFile; }
原文地址:https://www.jb51.cc/csharp/95000.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。