Postsharp получает возвращаемый тип перехваченного метода

Как я могу получить возвращаемый тип перехваченного метода? Я пишу механизм кэширования на уровне методов и хочу использовать postsharp для перехвата вызовов методов. Однако мне нужно иметь возможность привести мой сохраненный объект к исходному типу метода.

 public override void OnEntry(MethodExecutionArgs InterceptedItem)
    {
        if (_instance==null)
            _instance = new CouchbaseClient();



        string Key = GetCacheKey(InterceptedItem);


        var CacheItem = _instance.Get(Key);

        if (CacheItem != null)
        {
            // The value was found in cache. Don't execute the method. Return immediately.
            //string StringType = (String)_instance.Get(Key+"Type");
            JavaScriptSerializer jss = new JavaScriptSerializer();
            InterceptedItem.ReturnValue = jss.Deserialize<Object>(CacheItem.ToString());
            //Type Type = Type.GetType(StringType);
            InterceptedItem.ReturnValue = (Object)InterceptedItem.ReturnValue;
               // jss.Deserialize(CacheItem.ToString(), Type.GetType(StringType));
            InterceptedItem.FlowBehavior = FlowBehavior.Return;
        }
        else
        {
            // The value was NOT found in cache. Continue with method execution, but store 
            // the cache key so that we don't have to compute it in OnSuccess.
            InterceptedItem.MethodExecutionTag = Key;
        }
    }

person CodeMilian    schedule 21.04.2014    source источник
comment
Пожалуйста, покажите свой код. что ты уже испробовал? В какой момент вашего кода вам нужно привести кешированный объект?   -  person Markus    schedule 21.04.2014
comment
InterceptedItem.ReturnValue = jss.Deserialize‹Object›(CacheItem.ToString());   -  person CodeMilian    schedule 21.04.2014
comment
Я прав, проблема в Object в jss.Deserialize<Object>(CacheItem.ToString());? Почему вы храните объекты в виде строк JSON в кеше? Разве вы не можете просто поместить объекты в кеш и избежать сериализации и десериализации?   -  person Markus    schedule 21.04.2014
comment
Поскольку я использую диван (NoSQL), я думаю, что я ограничен сохранением данных в виде объектов json. Я пытался сохранить объект в собственном формате, но когда я это делаю, объект не сохраняется. Я должен сказать, что я очень новичок в кушетке, поэтому мне, вероятно, не хватает некоторых вариантов хранения.   -  person CodeMilian    schedule 21.04.2014


Ответы (1)


Вместо использования

InterceptedItem.ReturnValue = jss.Deserialize<Object>(CacheItem.ToString());

Вы можете использовать следующий код, который позволяет указать тип объекта во время выполнения (аргумент универсального типа определяется во время разработки):

var mthInfo = InterceptedItem.Method as MethodInfo;
if (mthInfo != null)
    InterceptedItem.ReturnValue = jss.Deserialize(CacheItem.ToString(), mthInfo.ReturnType);
else
    InterceptedItem.ReturnValue = null;

Вы можете получить объект MethodBase, используя свойство Method объекта MethodExecutionArgs. Однако, поскольку MethodBase также используется для методов без типа возвращаемого значения (например, в случае ConstructorInfo), вам необходимо привести его к MethodInfo, чтобы иметь доступ к возвращаемому типу.

person Markus    schedule 21.04.2014