2009-12-17 2 views
0

Есть ли способ создать экземпляр HttpPostedFile с 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); 

Но оба они не работают.

Update: по-видимому, внутренний конструктор выглядит следующим образом:

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

+0

Да, это для модульного тестирования. –

ответ

1

Я бы пошел другим путем. Просто добавьте еще один уровень абстракции: создайте интерфейс IHttpPostedFile со всеми членами, которые вам нужны, и используйте их как в коде, так и в тестах. Когда у вас есть этот интерфейс, у вас есть два пути: вы можете использовать утиную типизацию «cast» IHttpPostedFile по стандарту HttpPostedFile или вы можете реализовать этот интерфейс в своем собственном классе, который переадресует вызовы на агрегированный экземпляр класса HttpPostedFile.

1

HttpPostedFile класс ожидает экземпляр класса HttpInputStream не MemeoryStream. HttpInputStream снова является внутренним классом, поэтому вам нужно создать это, используя отражение. Вам действительно нужно это делать?

Смежные вопросы