2010-08-31 4 views
1

В C# Я хочу, чтобы создать общий метод, который:C# общий метод + отражение вопрос

  1. принимает объект MethodInfo в качестве параметра.
  2. Возвращает объект, возвращаемый при вызове MethodInfo.

Источником моей путаницы в том, что я хочу, чтобы метод, который будет набран обобщенно к тому же типу возвращаемого в качестве объекта MethodInfo, который получает передается в.

ответ

2

Вы не можете это сделать. По определению, генерики являются конструкцией времени компиляции, а тип возвращаемого значения MethodInfo - это то, что известно только во время выполнения (когда вы получаете конкретный экземпляр MethodInfo) и будет меняться от вызова к вызову.

+0

Я, если только не знаю говоря, что это невозможно, справедливо. Например, вы можете создать обертку MethodInfo , которая гарантирует, что она вернет объект типа T и по-прежнему получит выгоду от генерических данных компиляции в результате (пока ваш прецедент может по крайней мере гарантировать, что вы знали T во время компиляции). –

+0

Вопрос спрашивает, что метод принимает экземпляр 'MethodInfo', а не какого-либо другого типа. Что имеет смысл, так как 'MethodInfo' - это то, что вы возвращаете из Reflection. Конечно, если вы действительно знаете тип, который он будет возвращать во время компиляции, вы можете обернуть его броском, но это победит цель сделать все это в первую очередь. –

+0

Ну, у меня возникли проблемы с представлением сценария, в котором вы хотите это сделать, и не знаете тип возвращаемого значения во время компиляции - если вы этого не сделаете, в первую очередь не будет пользы от дженериков. Если вы это сделаете, есть примеры использования, например, для сканирования сборки для методов, соответствующих определенному формату (включая тип возврата), и их агрегации в качестве объектов MethodInfo, например, как часть библиотеки шаблонов и т. Д. –

1

Павел Минаев прав,

Мое предложение в этом случае (конечно, я не знаю, весь контекст) это использовать метод, который возвращает динамический тип, конечно, что не наберется.

public dynamic MyMethod(MethodInfo methodInfo) 

Или, так как вы знаете, что тип возвращаемого значения, положить, что при вызове метода:

public T MyMethod<T>(MethodInfo methodInfo) 

, конечно, вы собираетесь получить в беде внутри метода КАРТОГРАФИРОВАНИЯ преобразования. , но вы также можете поместить преобразования в качестве параметра с помощью лямбда, как:

public T MyMethod<T>(MethodInfo methodInfo, Func<object, T> conversion) 

я думаю, что вызов метода будет очень понятно, как:

Console.WriteLine(MyMethod(methodInfo, (a) => Convert.ToString(a))); 
Смежные вопросы