2010-10-13 84 views
5

有没有办法让我这个扩展方法的intellisensible参数?LINQ扩展方法帮助寻求II

目前,我可以通过工具提示来了解参数(在控制器操作方法中)是什么,但希望自信地使用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))%> 

我希望这是有道理的。让我知道是否有任何您需要协助的遗漏细节。

顺便说一句 - 任何优化技巧都很高兴在板上采用。

+0

我不明白这一点,从您例如你想intellisensed什么参数,你在哪里的价值从何而来? – Iain 2010-10-28 21:15:01

+0

hi iain - 参数将来自通用表达式>操作。即我可以'指向'一个名为GetStuff(int id,字符串名称)的动作,并且智能感应应该启动这些参数名称。实际上,自写这篇文章以来,我设法让它工作,所以在某个时候更新示例。 – 2010-10-29 07:35:40

回答

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中看到它们。看到下面的图片。

intellisense

+0

实际上,这是一个很好的建议+1 – 2010-12-15 21:09:19

+0

考虑将其标记为答案,如果它有帮助。谢谢:) – 2010-12-15 21:24:27

+1

hi zain,我给了你+1,但它没有完全回答我的要求,所以现在不会将它标记为明确的答案。但再次,感谢您的输入;) – 2010-12-16 12:17:21