2013-06-16 6 views
6

पर जेनेरिक एक्सटेंशन विधि IQueryable पर एक एक्सटेंशन विधि लिखी है जो एक ही प्रकार का IQueryable देता है, बस थोड़ा सा फ़िल्टर किया जाता है। मान लें कि यह ऐसा ही कुछ है करते हैं:IQueryable <T>

public static IEnumerable<T> Foo<T>(this IEnumerable<T> source, int? howmany = null) 
{ 
    if (howmany.HasValue) 
     return source.Take(howmany.Value); 
    return source; 
} 

उपरोक्त विधि बुला मैं अन्य विधि है कि अन्य सामान्य वर्ग के उदाहरण वापस आ जाएगी की जरूरत है, लेकिन के रूप में सरल someLinqResult.Foo(2) रूप

है अन्य आधार वर्ग (नहीं के साथ उपरोक्त स्रोत T के समान)। तो, यहां कोड है, आइए मान लें कि इस विधि को दिए गए प्रकार की सूची (इनपुट प्रकार के अलावा IQueryable के अलावा) की वापसी करना है, लेकिन वही लंबाई [वास्तविक समस्या NHibernate क्वेरी परिणामों को बदलने के बारे में है, लेकिन यह ' टी बात):

public static List<TTarget> Bar<TTarget,TSource>(this IEnumerable<TSource> source) 
{ 
    return new List<TTarget>(source.Count()); 
} 
अब

, यह देखते हुए कि strLinqResultIQueryable<string> है, मैं इसे strLinqResult.Bar<int,string>(); कॉल करने के लिए की जरूरत है।

बिंदु है, मुझे दोनों प्रकारों को पारित करना होगा, भले ही पहले व्यक्ति को पहले से ही ज्ञात है क्योंकि मैं पहले से परिभाषित IQuerable पर विधि को कॉल कर रहा हूं।

मैं चूंकि यह Foo(2) और नहींFoo<string>(2) कॉल करने के लिए पर्याप्त था सोचा संकलक "पारित/लगता है कि" स्वचालित रूप से टाइप करने में सक्षम है।

तो मुझे दूसरी विधि Bar<int,string>(); क्यों कॉल करने की आवश्यकता है और न केवल Bar<int>()?


वास्तविक कोड:

public static ListResponse<TResponse> 
     BuildListResponse<T,TResponse>(this IQueryable<T> iq, ListRequest request) 
     where TResponse: new() 
    { 
     var result = iq.ApplyListRequestParams(request).ToList().ConvertAll(x => x.TranslateTo<TResponse>()); 
     var tcount = iq.Count(); 
     return new ListResponse<TResponse> { 
       Items = result, 
       _TotalCount = tcount, 
       _PageNumber = request._PageNumber ?? 1, 
      }; 
    } 

ApplyListRequestParams उदाहरण कोड से Foo विधि की तरह है - यह सिर्फ पृष्ठांकन & आदेश ListRequest वस्तु में उपलब्ध पैरामीटर लागू होता है।

Itemspublic List<T> Itemsclass ListResponse<T> में public List<T> Items है।

TranslateTo सर्विसस्टैक से एक तरीका है।

उपरोक्त विधि IQueryable<T> NHibernate द्वारा दिया पर बुलाया अनुरोध मानकों (आदेश, पृष्ठांकन) लेता है, उन्हें लागू होता है (टी डोमेन मॉडल है), और फिर DomainModel से प्रकार TResponse के डीटीओ वस्तु को परिणामों की सूची बदल देती है। सूची को जेनेरिक प्रतिक्रिया वर्ग में लपेटा जाता है (जेनेरिक, इसलिए यह कई डीटीओ प्रकारों के लिए पुन: प्रयोज्य है)

+0

क्या आपने परिभाषा को 'बार (...)' पर स्विच करने का प्रयास किया है? – PinnyM

+0

@PinnyM हाँ, मैंने किया। यह अभी भी कहता है कि मुझे 2 टाइप पैरामीटर – migajek

+0

@ जोन पास करना होगा, मैंने दूसरे समाधान को गलत समझा होगा, लेकिन वास्तविक वर्ग को विस्तारित करना सवाल से बाहर है - इसे विस्तार विधि होना चाहिए! – migajek

उत्तर

3

यदि मैं आपकी समस्या को सही ढंग से समझ रहा हूं, तो आप जितना संभव हो उतने पैरामीटर इनपुट करने का प्रयास कर रहे हैं। यह बस संभव नहीं है। यह सब या कोई नहीं है जहां यह अपने आप सब कुछ पता लगा सकता है।

केवल कुछ निर्दिष्ट करने में समस्या यह है कि आप 1 कम प्रकार के पैरामीटर के साथ एक समान विधि पेश करने में सक्षम होंगे, और अब कार्यान्वयन तोड़ दिया होगा।

लेकिन किसी भी मौके पर आप अपनी मूल समस्या भी साझा कर सकते हैं? क्या संकलक इसे किसी अन्य तरीके से समझने में सक्षम हो सकता है?

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