2009-12-17 162 views
0

有没有办法用Reflection创建HttpPostedFile的实例?使用反射创建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 }); 
+0

用于单元测试吗? – bniwredyc 2009-12-17 11:06:46

+0

是的,它用于单元测试。 – 2009-12-17 11:25:44

回答

1

我会去另一条路线。只需添加一个抽象级别:与您需要的所有成员创建一个IHttpPostedFile接口,并在代码和测试中使用它们。当你有这个接口时,你有两种方法:你可以使用鸭子打字将IHttpPostedFile“铸造”到标准HttpPostedFile,或者你可以在你自己的类中实现这个接口,它将把呼叫转发给聚合实例HttpPostedFile类。

1

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