LINQ扩展方法求助 II

5

有没有一种方法可以使我在视图中“智能感知”这个扩展方法的参数?

目前,我可以获得一个工具提示来了解控制器操作方法中的参数,但是我希望可以自信地通过 IntelliSense 输入参数名称以确保“安全”。没有更多的话,以下是该方法及其用法:

public static string Script<T>(this HtmlHelper html,
                                Expression<Action<T>> action) where T:Controller
{
    var call = action.Body as MethodCallExpression;

    if (call != null)
    {
        // paramDic - to be used later for routevalues
        var paramDic = new Dictionary<string, object>();
        string actionName = call.Method.Name;
        var methodParams = call.Method.GetParameters();

        if (methodParams.Any())
        {
            for (int index = 0; index < methodParams.Length; index++)
            {
                ParameterInfo parameterInfo = methodParams[index];
                Expression expression = call.Arguments[index];
                object objValue;
                var expressionConst = expression as ConstantExpression;
                if(expressionConst!=null)
                {
                    objValue = expressionConst.Value;
                }
                else
                {
                    Expression<Func<object>> expressionConstOther =
                        Expression.Lambda<Func<object>>(
                          Expression.Convert(expression, typeof(object)),
                          new ParameterExpression[0]);
                    objValue = expressionConstOther.Compile()();
                }
                paramDic.Add(parameterInfo.Name, objValue);
            }
        }
        string controllerName = typeof(T).Name;
        if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
        {
            controllerName = controllerName.Remove(controllerName.Length - 10, 10);
        }

        var routeValues = new RouteValueDictionary(paramDic);
        var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
        var url = urlHelper.Action(actionName, controllerName, routeValues);

        const string linkFormat = "<script type=\"text/javascript\" src=\"{0}\"></script>";
        string link = string.Format(linkFormat, url);

        return link;
    }
    return null;
}

用法(其中FundShareholderController是我的控制器,x.JsFile()是其上的一个操作方法):

<%=Html.Script<FundShareholderController>(x => x.JsFile("CreateInvestorBookingJsFile", 0))%>

我希望这有意义。如果您需要任何遗漏的细节来协助,请告诉我。
顺便说一下 - 我很乐意接受任何优化建议。

从您的示例中,我不明白您想要哪些参数智能感应,并且这些值从哪里来? - Iain
嗨,艾恩 - 参数将来自通用的Expression<Action<T>> action。例如,我可能会“指向”一个名为GetStuff(int id,string name)的操作,并且智能感应应该在这些参数名称上启动。实际上,自从写下这篇文章以来,我已经成功地让它工作了,所以稍后将更新示例。 - jim tollan
1个回答

5
尝试在方法上添加以下XML注释。
/// <summary>
/// The summary of my Script Extension method.
/// </summary>
/// <typeparam name="T">T is the type of Controller</typeparam>
/// <param name="html">The HTML helper.</param>
/// <param name="action">The action Method of the Controller.</param>
/// <returns></returns>

在编写上述扩展方法的注释后,我可以在 IntelliSense 中看到它们。请参见下面的图像。

1
嗨,Zain,我给了你+1,但它并没有完全回答我的要求,所以暂时不会将其标记为最终答案。但再次感谢你的贡献 ;) - jim tollan
嗨,再次见到你,就此而言,这对大多数情况来说可能是可以的,所以你得到了一个“答案” :) - jim tollan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接