Я думаю, что вы ответили на свой вопрос - это не очень хорошая идея. Методы расширения полезны во многих случаях ради удобства, но семантическая несогласованность / путаница перевешивает это.
Я полностью согласен с Нолдорином, но я хотел бы расширить его ответ.
Мы используем мапперы в нашей кодовой базе, и все они используют интерфейс IMaper . Мы также использовали, чтобы каждый из наших картографов реализовывал метод MapAll для отображения входных данных IEnumerable.
до выхода IEnumerable и каждая реализация была одинаковой. Было предложено создать метод расширения для MapAll, но вопрос заключался в том, для какого объекта он будет использоваться:
public IEnumerable<TOutput> MapAll<TInput, TOutput>(
this IEnumerable<TInput>, IMapper<TInput, TOutput>)
Или
public IEnumerable<TOutput> MapAll<TInput, TOutput>(
this IMapper<TInput, TOutput>, IEnumerable<TInput>)
Хотя они оба будут выполнять одну и ту же работу, первое из них будет очень запутанным, поскольку метод MapAll применим только в определенных случаях, но он всегда будет присутствовать в вашем интеллекте. где в качестве второго подхода, хотя вам может не понадобиться метод MapAll все время, ясно, какова цель метода.
Таким образом, чтобы ваше предложение работало, вы можете создать метод расширения для интерфейса IDbCommand, который вместо этого принимает строку (извините за попытку VB.Net):
<Extension()> Function Execute(
ByRef con As IDbConnection, ByVal command as String) As Data.DataTable
...
End Function
И используйте это так:
<%For Each dr In conn.Execute("select * from product").Rows%>
some HTML output here..
<%Next%>
Я думаю, что имя метода неясно и должно быть что-то вроде GetDataTable, но вы можете понять, что я имею в виду.
Если вы хотите, вы можете увидеть мое сообщение в блоге об интерфейсе и методе расширения mapper здесь , чтобы дать вам некоторый контекст относительно того, о чем я говорил.