2009-06-16 10 views
6

मैं समझने की कोशिश कर रहा हूं कि विधि समूह को अभिव्यक्ति में परिवर्तित करने के लिए एक सरल वाक्यविन्यास है या नहीं। यह lambdas के साथ बहुत आसान लगता है, लेकिन यह तरीकों के अनुवाद नहीं करता है:अभिव्यक्ति के लिए विधि समूह को कनवर्ट करें

public delegate int FuncIntInt(int x); 

को देखते हुए सभी को नीचे मान्य हैं:

Func<int, int> func1 = x => x; 
FuncIntInt del1 = x => x; 
Expression<Func<int, int>> funcExpr1 = x => x; 
Expression<FuncIntInt> delExpr1 = x => x; 

लेकिन अगर मैं एक साथ एक ही कोशिश उदाहरण विधि, यह अभिव्यक्तियों पर टूट जाती है:

Foo foo = new Foo(); 
Func<int, int> func2 = foo.AFuncIntInt; 
FuncIntInt del2 = foo.AFuncIntInt; 
Expression<Func<int, int>> funcExpr2 = foo.AFuncIntInt; // does not compile 
Expression<FuncIntInt> delExpr2 = foo.AFuncIntInt;  //does not compile 

पिछले दोनों में से दोनों "सी गैर-प्रतिनिधि प्रकार 'System.Linq.Expressions.Expression < ...>' में कनवर्ट विधि समूह 'AFuncIntInt' कनवर्ट करें। आप विधि आह्वान करने का इरादा किया? "

तो वहाँ एक अभिव्यक्ति में एक विधि चल मैदान पर कब्जा करने के लिए एक अच्छा वाक्य रचना है?

धन्यवाद, आर्नी

उत्तर

6

यह कैसे के बारे में?

Expression<Func<int, int>> funcExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
    Expression<FuncIntInt> delExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
+0

दोह .. मुझे अब बेवकूफ लगता है। यह पूरी तरह से काम करता है। धन्यवाद –

+2

क्या आपको कभी इस के लिए एक अच्छा सिंटैक्स मिला है? मैं पूरी तरह से समझ नहीं पा रहा हूं कि क्यों संकलक एक अभिव्यक्ति के विधि समूह को नहीं समझ सकता > जब यह इसे Func के लिए समझ सकता है .. – skrebbel

+0

मेरी धारणा यह है कि foo.AFuncIntInt एक विधि समूह नहीं है, अभिव्यक्ति नहीं और विधि समूह से अभिव्यक्ति तक कोई स्वचालित रूपांतरण नहीं है, हालांकि लैम्बडा को एक विधि समूह या अभिव्यक्ति के रूप में स्वीकार करने के लिए स्वचालित रूपांतरण होता है –

0

यह भी संभव है यह NJection.LambdaConverter LambdaExpression कनवर्टर लाइब्रेरी के लिए एक प्रतिनिधि का उपयोग कर ऐसा करने के लिए

public class Program 
{ 
    private static void Main(string[] args) { 
     var lambda = Lambda.TransformMethodTo<Func<string, int>>() 
          .From(() => Parse) 
          .ToLambda();    
    } 

    public static int Parse(string value) { 
     return int.Parse(value) 
    } 
} 
संबंधित मुद्दे