Хорошо, возможно, название не самая описательная вещь в мире, но эта проблема убивает меня. Я пытаюсь создать вспомогательный метод ActionLinkFor, например:
public ActionResult Index()
{
// Does Stuff
}
public ActionResult SomeAction(int param1)
{
// Does Stuff
}
Это два метода действия. Методы действия могут иметь любое количество параметров, но для целей моего выражения мне все равно. В идеале я пытался что-то вроде этого:
<%= Html.ActionLinkFor<HomeController>(m => m.Index, "Return Home") %>
, который вернул бы
<a href="/Home/Index">Return Home</a>
на основе выражения, которое оно проанализировало. Цель в том, что теперь я использую не «магические строки» для определения ссылок, а вместо этого скомпилированное лямбда-выражение. Если что-то было изменено, или страница была изменена, было бы ясно, на какие ссылки указывали.
Проблема в том, что лямбда-выражение для этого дескриптора метода, похоже, не приводит к правильной перегрузке. Я подумал, что мне придется сделать несколько перегрузок примерно так:
public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, ActionResult>> methodExpression, string linkName)
{
// return parsed expression translated into a link
}
public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, object, ActionResult>> methodExpression, string linkName)
{
// Does the same thing
}
Таким образом, когда я сказал
m => m.Index // Chooses first ActionLinkFor since the Lambda would be a Func<Controller, object>
m => m.SomeAction // Chooses second ActionLinkFor since the method signature is different.
Однако, похоже, это не работает. Если я укажу несколько общих параметров, например, так:
<%= Html.ActionLinkFor<HomeController, int>(m => m.SomeAction, "Some Link") %>
он прекрасно его подхватывает, но мне не нужно указывать сигнатуру метода в общем списке аргументов. Итак, мои вопросы:
1) Есть ли способ «нацелить» имя метода независимо от его подписи? Я могу использовать отражение, чтобы получить все методы и использовать волшебную строку, но я хочу, чтобы во время разработки было лямбда-выражение, чтобы я мог тогда указать ссылку.
2) Если вы можете предоставить решение, существует ли простой способ анализа имени метода? Алгоритм, который я сейчас использую, скорее всего, плохая идея, и в действительности он включает в себя несколько преобразований и последующий анализ строки, когда я не смог получить более удобный тип.