पर जेनेरिक एक्सटेंशन विधि 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());
}
अब
, यह देखते हुए कि strLinqResult
IQueryable<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
वस्तु में उपलब्ध पैरामीटर लागू होता है।
Items
public List<T> Items
class ListResponse<T>
में public List<T> Items
है।
TranslateTo
सर्विसस्टैक से एक तरीका है।
उपरोक्त विधि IQueryable<T>
NHibernate द्वारा दिया पर बुलाया अनुरोध मानकों (आदेश, पृष्ठांकन) लेता है, उन्हें लागू होता है (टी डोमेन मॉडल है), और फिर DomainModel
से प्रकार TResponse
के डीटीओ वस्तु को परिणामों की सूची बदल देती है। सूची को जेनेरिक प्रतिक्रिया वर्ग में लपेटा जाता है (जेनेरिक, इसलिए यह कई डीटीओ प्रकारों के लिए पुन: प्रयोज्य है)
क्या आपने परिभाषा को 'बार (...)' पर स्विच करने का प्रयास किया है? –
PinnyM
@PinnyM हाँ, मैंने किया। यह अभी भी कहता है कि मुझे 2 टाइप पैरामीटर – migajek
@ जोन पास करना होगा, मैंने दूसरे समाधान को गलत समझा होगा, लेकिन वास्तविक वर्ग को विस्तारित करना सवाल से बाहर है - इसे विस्तार विधि होना चाहिए! – migajek