2012-04-16 15 views
7

Func<> गतिशील रूप से तर्क टाइप करने का कोई तरीका है, इसलिए मुझे अंतहीन if कथन का उपयोग करने की आवश्यकता नहीं है?गतिशील रूप से Func <> प्रकार

कुछ की तरह:

Type t = Type.GetType("System.Decimal"); 
Func<t> foo = new Func<t>(some_function); 

बजाय:

Func<Decimal> foo = new Func<Decimal>(some_function); 

अद्यतन:

यहाँ मेरी कोड से एक टुकड़ा है:

Type t = typeof(StavkaDokumenta).GetProperty(pd.Polje).PropertyType; 
ParameterExpression pe = Expression.Parameter(typeof(StavkaDokumenta), "stavka"); 
Expression expr = Expressions.ResolveCompleteExpression(pe, pd.Expression); 
Expression final = Expression.Convert(expr, t); 
if (t == typeof(decimal)) 
{ 
    var lambda = Expression.Lambda<Func<StavkaDokumenta, decimal>>(final, pe); 
    o = lambda.Compile().Invoke(stavka); 
} 
if (t == typeof(decimal?)) 
{ 
    var lambda = Expression.Lambda<Func<StavkaDokumenta, decimal?>>(final, pe); 
    o = lambda.Compile().Invoke(stavka); 
} 
else if (t == typeof(int)) 
{ 
    var lambda = Expression.Lambda<Func<StavkaDokumenta, int>>(final, pe); 
    o = lambda.Compile().Invoke(stavka); 
} 
else if (t == typeof(int?)) 
{ 
    var lambda = Expression.Lambda<Func<StavkaDokumenta, int?>>(final, pe); 
    o = lambda.Compile().Invoke(stavka); 
} 
else if (t == typeof(string)) 
{ 
    var lambda = Expression.Lambda<Func<string>>(final, null); 
    o = lambda.Compile().Invoke(); 
} 

pd.Polje स्ट्रिंग है - एक संपत्ति इन्स का नाम विचार "StavkaDokumenta" कक्षा। पीडी.एक्सप्रेस स्ट्रिंग अभिव्यक्ति है जिसे पोल्जे के प्रकार का मूल्यांकन करना चाहिए। स्टेका स्काकाडोक्यूमेंटा का एक उदाहरण है।

+4

यदि आप अंतहीन ifs का उपयोग कर रहे हैं, तो शायद आपके वर्तमान दृष्टिकोण के बारे में कुछ ऐसा हो सकता है जिसे बेहतर किया जा सकता है? मैं कम से कम इसे मानता हूँ। – Botz3000

+3

यदि आप श्रृंखला को हल करने का प्रयास कर रहे हैं तो क्या आप अंतहीन का उदाहरण प्रदान कर सकते हैं? – GregC

+3

यदि आप अंतहीन 'xxx कुछ टाइप टाइप' का उपयोग कर रहे हैं, तो शायद आपके डिज़ाइन में कुछ गड़बड़ है। –

उत्तर

9

अब जब कि तुम से पता चला है क्या तुम सच में चाहते हैं, इस सवाल का जवाब भी बहुत कुछ सरल है: आप जाहिरा तौर पर केवल कि अभिव्यक्ति की वापसी मान में रुचि रखते हैं, आप इस के लिए अपने कोड को बदल सकता है:

Type t = typeof(StavkaDokumenta).GetProperty(pd.Polje).PropertyType; 
ParameterExpression pe = Expression.Parameter(typeof(StavkaDokumenta), "stavka"); 
Expression expr = Expressions.ResolveCompleteExpression(pe, pd.Expression); 
Expression final = Expression.Convert(expr, t); 

if (t == typeof(string)) 
{ 
    var lambda = Expression.Lambda<Func<string>>(final, null); 
    o = lambda.Compile().Invoke(); 
} 
else 
{ 
    var lambda = Expression.Lambda(final, pe); 
    o = lambda.Compile().DynamicInvoke(stavka); 
} 

पुराना जवाब:

आप इस लक्ष्य को हासिल करने के लिए Func<T> को जेनरिक और अंतर्निहित रूपांतरण का उपयोग कर सकते हैं:

Func<T> GetFunc<T>(Func<T> func) 
{ 
    return func; 
} 

तो जैसे एक विधि समूह के साथ यह कॉल करें:

var foo = GetFunc(SomeMethod); 

मतलब यह है कि SomeMethod इस तरह दिखता है:

decimal SomeMethod() 
{ 
    // ... 
} 

foo प्रकार Func<decimal> का हो जाएगा। यदि SomeMethod का रिटर्न प्रकार string होगा, तो foo का प्रकार Func<string> होगा।


क्या इस कोड में होता है निम्नलिखित:

पैरामीटर कि GetFunc में भेजा जाता है एक तथाकथित "विधि समूह" और नहीं प्रकार Func<T> की एक चर रहा है। हालांकि, वहाँ Func<T> के एक चर के लिए एक विधि समूह से एक अंतर्निहित रूपांतरण मौजूद है: अंतर्निहित रूपांतरण है

Func<decimal> func = SomeMethod; // an implicit conversion happens here 

यही यहाँ क्या हो रहा है: GetFunc इससे पहले भी कहा जाता है, विधि समूह SomeMethod के एक चर बदल जाती है Func<T> टाइप करें। T के लिए उपयोग किए जाने वाले ठोस प्रकार को विधि SomeMethod() के रिटर्न प्रकार के आधार पर संकलक द्वारा अतिरिक्त रूप से अनुमानित किया जाता है।
हमारा लक्ष्य हमारे विधि समूह के आधार पर Func<T> का उदाहरण बनाना था। और क्योंकि विधि को कॉल करने से पहले पैरामीटर के रूपांतरण में पहले से ही होता है, हम बस विधि से उस बनाए गए उदाहरण को वापस कर देते हैं।

+0

मुझे खेद है, लेकिन मैं इसका पालन नहीं करता हूं। आपकी विधि 'GetFunc ' प्रभावी रूप से कुछ भी नहीं कर रही है। यह पैरामीटर को उसी प्रकार के रूप में देता है जैसा यह शुरू हुआ। – Yuck

+0

@Yuck: जादू स्वयं कॉल में हो रहा है क्योंकि विधि समूह ('कुछ विधि ') से एक अंतर्निहित रूपांतरण मौजूद है जो' Func 'प्रकार के चर के लिए है। –

+0

मैं इसे अब डैनियल की कोशिश करूंगा, लेकिन मुझे लगता है कि यह चाल करेगा। मैं अटक गया था और ifs के साथ बसने के लिए शुरू कर रहा था ... –

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