使用Reflection创建HttpPostedFile的实例

时间:2009-12-17 11:00:08

标签: c# reflection

有没有办法用Reflection创建HttpPostedFile的实例。

我试过了:

var obj = (HttpPostedFile)typeof(HttpPostedFile).GetConstructor(
                 BindingFlags.NonPublic | BindingFlags.Instance,
                 null, Type.EmptyTypes, null).Invoke(null);

var obj2 = Activator.CreateInstance(typeof(HttpPostedFile)
           , BindingFlags.NonPublic | BindingFlags.Instance
           , null
           , new object[] { }
           , System.Globalization.CultureInfo.CurrentCulture);

但他们两个都不起作用。

更新:显然内部构造函数如下所示:

internal HttpPostedFile(string filename, string contentType, Stream stream)

我试过这个但没有成功:

Stream s = new MemoryStream(b.blob);
//var httpPostedFile = new HttpPostedFile();
Type[] parameters = { typeof(string), typeof(string), typeof(Stream) };

var obj = (HttpPostedFile)typeof(HttpPostedFile).GetConstructor(
      BindingFlags.NonPublic | BindingFlags.Instance,
      null, parameters, null)
      .Invoke(new object[] { "filename", "image/jpeg", s });

2 个答案:

答案 0 :(得分:1)

HttpPostedFile类期望HttpInputStream类的实例不是MemeoryStream。 HttpInputStream再次是一个内部类,因此您需要使用反射创建它。你真的需要这样做吗?

答案 1 :(得分:1)

我会走另一条路。只需添加一个抽象级别:创建一个IHttpPostedFile接口,其中包含您需要的所有成员,并在您的代码和测试中使用它们。当你有这个界面时,你有两种方法可以:你可以使用duck typing来“强制转换”IHttpPostedFile到标准HttpPostedFile,或者你可以在你自己的类中实现这个接口,这将转发到HttpPostedFile类的聚合实例。