2010-10-13 16 views
5

वहाँ मेरे विचार से 'intellisensible' इस विस्तार विधि के मापदंडों बनाने के लिए एक रास्ता है की मांग?LINQ विस्तार विधि सहायता द्वितीय

पल में, मैं क्या मानकों (नियंत्रक कार्रवाई विधि में) कर रहे हैं की एक टूलटिप कुहनी से हलका धक्का प्राप्त कर सकते हैं लेकिन 'सुरक्षा' के लिए आत्मविश्वास से 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))%> 

मुझे आशा है कि यह समझ में आता है । मुझे बताएं कि क्या कोई लापता विवरण है जिसे आपको सहायता करने की आवश्यकता है।

Btw - किसी भी अनुकूलन युक्तियों की ख़ुशी पर बोर्ड भी लिया जाता है।

+0

मैं समझ नहीं है, अपने उदाहरण क्या मानकों आप intellisensed चाहते से, और जहां मूल्यों से आते हैं? – Iain

+0

हाय आईन - पैरामीटर सामान्य अभिव्यक्ति > कार्रवाई से आएंगे। यानी मैं GetStuff (int id, string name) नामक एक क्रिया को 'पॉइंट' कर सकता हूं और उन पैरामीटर नामों पर इंटेलिजेंस को लात मारना चाहिए। असल में, इसे लिखने के बाद, मैंने इसे काम करने में कामयाब रहा है, इसलिए कुछ बिंदु पर उदाहरण अपडेट किया जाएगा। –

उत्तर

5

निम्नलिखित की तरह विधि पर एक्सएमएल टिप्पणियाँ जोड़ने का प्रयास करें।

/// <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 –

+0

उत्तर के रूप में अंकन अगर यह मदद की पर विचार नहीं है। धन्यवाद :) –

+1

हाय जैन, मैं आप +1 दिया, लेकिन यह पूरी तरह से मेरी आवश्यकता का जवाब नहीं है, इसलिए होगा पल मार्क के रूप में निश्चित जवाब पर नहीं। लेकिन फिर, इनपुट के लिए धन्यवाद;) –

संबंधित मुद्दे