2013-08-12 3 views
0

У меня есть следующий код, который разрешает обслуживание, используя не общий метод. Я не могу использовать общий вариант, который бы разрешил мою проблему, потому что я не знаю заранее, какой тип будет передан.Как преобразовать объект в правильный тип

Мне не нравится самая последняя строка, она работает хорошо, но я был интересно, могу ли я «передать» моего обработчика на правый интерфейс, чтобы напрямую вызвать метод Handle? В моем случае я точно знаю, что тип возвращает по решению, будет иметь тип handlerType.

var handlerType = typeof (IQueryHandler<,>).MakeGenericType(query.GetType(), typeof (TResponseData)); 
var handler = _container.Resolve(handlerType); 
var resp = new Response<TResponseData>(); 
resp.Data = (TResponseData) handler.GetType().GetMethod("Handle").Invoke(handler, new object[] {query}); 

ответ

3

Если вам не нравится последнее с помощью отражения, вы можете воспользоваться dynamic ключевым словом:

var handlerType = typeof (IQueryHandler<,>) 
         .MakeGenericType(query.GetType(), typeof (TResponseData)); 
dynamic handler = _container.Resolve(handlerType); 
var resp = new Response<TResponseData>(); 
resp.Data = (TResponseData) handler.Handle(query); 
+1

я прав, полагая, что 'dynamic' под капотом будет делать то же самое как отражение в исходном коде? т.е. что это отличие читаемости, а не эффективности? – Chris

+1

@ Крис: вы можете предпочесть [ответ Эрика] (http://stackoverflow.com/questions/7478387/dynamic-and-performance), чтобы понять больше –

+0

@CuongLe: динамический позволяет мне сэкономить несколько нажатий клавиш, и я могу использовать его как последнее средство, но меня больше интересовала возможность использования метода handlertype для моего обработчика (autofac не смог бы вернуть ничего подобного этого типа) – Dave

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