C # Reflection StackTrace получить значение - PullRequest
2 голосов
/ 13 марта 2010

В моем текущем проекте я довольно интенсивно использую отражения, чтобы значительно упростить связь между моими контроллерами и сервисами wcf. Теперь я хочу получить значение из Session внутри объекта, который не имеет прямого доступа к HttpSessionStateBase (IE: не контроллер). Например, ViewModel. Я мог бы передать это или передать ссылку на него и т. Д., Но это не оптимально в моей ситуации.

Поскольку в какой-то момент в моем сценарии все происходит из контроллера, я могу сделать следующее, чтобы переместить мешок в контроллер, откуда поступил вызов, довольно просто:

var trace = new System.Diagnostics.StackTrace();

foreach (var frame in trace.GetFrames())
{
  var type = frame.GetMethod().DeclaringType;
  var prop = type.GetProperty("Session");

  if(prop != null)
  {
    // not sure about this part...
    var value = prop.GetValue(type, null);
    break;    
  }
}

Проблема здесь в том, что я не могу понять, как получить «экземпляр» контроллера или свойство Session, чтобы я мог читать из него.

Ответы [ 3 ]

4 голосов
/ 13 марта 2010

Это невозможно. Способ, которым аргументы передаются методу, является подробностью реализации, оставленной компилятору JIT. Например, он сильно отличается между x86 и x64. x86 передает аргументы в стеке, x64 передает первые 4 аргумента через регистры. Значения с плавающей точкой передаются либо в стек FPU, либо в регистр SSE. Etcetera.

Отладчик знает подробности, используя отладочную информацию, генерируемую JIT-компилятором Но использование отладочных интерфейсов в программе не может работать, программы не могут отлаживать себя.

3 голосов
/ 13 марта 2010

Я не думаю, что это возможно. StackTrace и StackFrame просто предоставляют вам метаданные о том, кто вызвал ваш метод, а не фактический экземпляр, который вам нужен.

1 голос
/ 13 марта 2010

Почему вы не можете использовать HttpContext.Current.Session? Вы не хотите ссылку на веб-часть? В противном случае, я думаю, вам понадобится интерфейс - где-то настроен фасад сеанса (который всегда полезен) - полезен синглтон или, может быть, он настроен с использованием контейнера, например, Unity. HttpContext поддерживает потоки и отлично работает. Вы можете сделать абстракцию в сеансе, предоставив фасад, который я сказал ранее, чтобы сделать его более независимым от провайдера, но все же использование инфраструктуры отладки в производственном коде ... сомнительно. :) Может быть, вы в некотором смысле можете использовать генерацию IL, если не хотите связывания?

...