Можете ли вы использовать обобщенные методы в C #, если тип неизвестен до времени выполнения? - PullRequest
17 голосов
/ 14 марта 2009

Самый простой способ объяснить, что я имею в виду, с примером кода. Это не компилируется, но есть ли способ достичь этого эффекта:

foreach(Type someType in listOfTypes)
{
    SomeMethod<someType>();
}

Было бы очень удобно, если бы это работало, но это не так. Есть ли другой способ добиться того же, что и выше, и почему C # не допускает, чтобы это было юридическим заявлением?

Редактировать: Похоже, что единственный способ сделать это через отражение, которое может быть слишком медленным для наших нужд. Любое понимание того, почему не существует эффективного способа и есть ли что-то подобное в работе для C # 4.0?

Ответы [ 3 ]

23 голосов
/ 14 марта 2009

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

GetType().GetMethod("SomeMethod").
    MakeGenericMethod(new Type[] { someType }).Invoke(this, null);

Обратите внимание, что если SomeMethod() не является публичным, ваш код может не выполняться в средах с низким уровнем доверия.

23 голосов
/ 14 марта 2009

Почему C # не допускает, чтобы это было юридическим заявлением?

Как уже отмечали другие, вы не можете этого сделать. Почему бы и нет? Хорошо, рассмотрим ваш пример:

foreach(Type someType in listOfTypes)
{
    SomeMethod<someType>();
}

Обратите внимание, что каждый тип в списке типов не может быть известен до времени выполнения , тогда как параметр типа SomeMethod должен быть известен во время времени компиляции . Компилятор не может указать, к какому SomeMethod<T> разрешить ваш вызов, так что это недопустимо.

В C # 4 это и многие другие подобные вещи будут возможны при включении DLR в CLR. В частности, динамический вызов метода позволит вам вызывать методы, которые могут быть неизвестны во время компиляции.

3 голосов
/ 14 марта 2009

Единственный способ сделать это сегодня - это размышление. См. MethodInfo.MakeGenericMethod (Type []) .

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