Mat*_*ord 15 c# reflection file-upload
我正在尝试与一个我无法控制的系统进行通信,但是其中一个方法需要一个HttpPostedFile,我的代码中有一个字节数组.有没有人有一个实例化HttpPostedFile的例子,因为我知道它的构造函数是内部的?
我发现的最好的是这个SO帖子使用反射然而他们被引导到另一个方向,我不能采取,因为我无法修改第三方系统方法签名.
par*_*cle 21
这真的是非常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, 0, data.Length});
// This is necessary if you will be using the returned content (ie to Save)
typeHttpRawUploadedContent
.GetMethod("DoneAddingBytes", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(uploadedContent, null);
// Create an HttpInputStream instance
object stream = (Stream)typeHttpInputStream
.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, streamParams, null)
.Invoke(new object[] {uploadedContent, 0, data.Length});
// Create an HttpPostedFile instance
HttpPostedFile postedFile = (HttpPostedFile)typeof(HttpPostedFile)
.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, parameters, null)
.Invoke(new object[] {filename, contentType, stream});
return postedFile;
}
Run Code Online (Sandbox Code Playgroud)
你可以试试
var constructorInfo = typeof(HttpPostedFile).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
var obj = (HttpPostedFile)constructorInfo
.Invoke(new object[] { "filename", "image/jpeg", null });
Run Code Online (Sandbox Code Playgroud)
obj会的类型HttpPostedFile。我将最后一个参数设置为空,但它必须是一个 HttpInputStream 。
| 归档时间: |
|
| 查看次数: |
17719 次 |
| 最近记录: |