Создание экземпляра HttpPostedFile с отражением - PullRequest
0 голосов
/ 17 декабря 2009

Есть ли способ создать экземпляр HttpPostedFile с помощью Reflection.

Я пытался:

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 ]

1 голос
/ 18 декабря 2009

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

1 голос
/ 18 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...