Хотя я согласен с тем, что вы должны использовать поддерживаемые библиотеки, когда они доступны, вместо того, чтобы использовать свои собственные, я думаю, что стоит поделиться, что на самом деле довольно сложно реализовать RedirectToAction. Приведенный ниже код, конечно, не завершен, но общая идея верна и может быть использована для превращения большого количества логики, основанной на отражениях, в безопасную логику типа.
string ActionLink<TController, T>(Expression<Func<TController,T>> actionExpression, bool useQueryString = false)
{
var controllerName = typeof(T).Name;
const string controllerPostfix = "Controller";
if (controllerName.EndsWith(controllerPostfix, StringComparison.InvariantCultureIgnoreCase))
{
controllerName = controllerName.Substring(0, controllerName.Length - controllerPostfix.Length);
}
var expBody = (MethodCallExpression)actionExpression.Body;
var method = expBody.Method;
var parameters = method.GetParameters().ToArray();
var arguments = string.Empty;
if (useQueryString){
arguments = GetQuerystring(expBody, parameters);
} else{
if (parameters.Length > 0)
{
arguments = "/" + string.Join
("/",
expBody.Arguments.Select
((arg, i) => string.Format("{0}",GetValue(arg))).
ToArray());
}
}
return "~/" + controllerName + "/" + expBody.Method.Name + arguments;
}
Как я уже сказал выше, не все возможности обрабатываются (и для краткости два метода исключены).
и нет никакой обработки ошибок, ожидаемой, что пользователи будут вести себя хорошо, но приведенный выше код позволяет написать
ACtionLink ((MyController c => c.ShowMeTheMoney (ThreatenWithGun: false, Shout: true));
возможно и вернет "~ / My / ShowMeTheMoney / false / true". Таким образом, не требуется больших усилий, чтобы превратить безопасное выражение типа в строку (или любой другой формат), когда это необходимо, и большую часть того, что необходимо сделать, можно повторно использовать в совершенно разных сценариях (таких как метод GetValue, использованный выше). который способен обходить дерево выражений, чтобы получить значение, представленное этим деревом выражений)