2009-09-10 7 views
16

मैं एक समारोह निम्नलिखित हस्ताक्षर किया है कि ...स्रोत कोड स्ट्रिंग के लिए एक अभिव्यक्ति ट्री कन्वर्ट

public string DoJunk(Expression<Func<bool>> expression) 

मैं एक तरह से कुछ मिलता-जुलता वापस करने के लिए "अभिव्यक्ति" पैरामीटर कन्वर्ट करने के लिए खोजने की कोशिश कर रहा हूँ है मूल स्रोत कोड (या मूल सॉस कोड का कम से कम एसी # प्रतिनिधित्व)। तो, किसी को इस तरह फ़ंक्शन को कॉल करता है, तो ...

DoJunk(() => (i + j) * 9 == Math.Round((double)j/(i - 3), 4)) 

... मैं इस के लिए अभिव्यक्ति बदलने में सक्षम होना चाहते हैं ...

(i + j) * 9 == Math.Round((double)j/(i - 3), 4) 

किसी को भी यह किया गया है?

+0

इसका संदर्भ क्या है? –

+0

मैं एक यूनिट परीक्षण ढांचे के लिए कुछ विचारों के साथ प्रयोग कर रहा हूं। मेरा विचार यह है कि यदि आप लैम्ब्डा के खिलाफ परीक्षण करते हैं और परीक्षण विफल रहता है, तो आप असफल कोड को वास्तव में दिखा सकते हैं। उदाहरण के लिए, "अपेक्षित: 4 वास्तविक: 5" प्राप्त करने के बजाय, आपको एक संदेश प्राप्त हो सकता है जैसे "अपेक्षित: उपयोगकर्ता। एज == 4 वास्तविक: उपयोगकर्ता। एज == 5" – herbrandson

उत्तर

8

यहाँ कुछ है कि (मोटे तौर पर) जैसा दिखता है मूल स्रोत में वापस अभिव्यक्ति पेड़ों की रूपांतरण पर चर्चा एक दिलचस्प लेख है, कोड के साथ,:

Expression Trees-Lambdas to CodeDom Conversion

अतिरिक्त नोट के रूप में, है आपने अभिव्यक्ति की ToString विधि को कॉल करने का प्रयास किया?

Expression<Func<int, int, bool>> expr = 
    (i, j) => (i + j) * 9 == Math.Round((double)j/(i - 3), 4); 

Console.WriteLine(expr.ToString()); 
// (i, j) => (Convert(((i + j) * 9)) = Round((Convert(j)/Convert((i - 3))), 4)) 

Console.WriteLine(expr.Body.ToString()); 
// (Convert(((i + j) * 9)) = Round((Convert(j)/Convert((i - 3))), 4)) 
+1

मैंने ToString() का उपयोग करने का प्रयास किया है, लेकिन यह मुझे कुछ बहुत बुरा लग रहा है ... (कनवर्ट करें ((मान (LambdaToStringSpike.Program + <> c__DisplayClass0) .i + मान (LambdaToStringSpike.Program + <> c__DisplayClass0) .j) * 9)) = गोल ((कनवर्ट करें (मान (LambdaToStringSpike.Program + <> c__DisplayClass0) .j)/कनवर्ट करें ((मान (LambdaToStringSpike.Program + <> c__DisplayClass0) .i - 3))), 4)) – herbrandson

+1

हाँ, मुझे लगता है कि जो आउटपुट आप देख रहे हैं वह जेनरेट किया गया है कब्जे वाले चर 'i' और 'j' को संभालने के लिए सी # कंपाइलर के पीछे के दृश्य। मेरे उदाहरणों में, 'i' और' j' स्थानीय हैं, इसलिए आउटपुट मूल स्रोत कोड के बहुत करीब है। – LukeH

6

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

using AgileObjects.ReadableExpressions; 

var myExpression = CreateBigExpressionTree(); 
var expressionSource = myExpression.ToReadableString(); 

मैं इसके बारे में a blog लिखा है, स्रोत on GitHub है, और भी है a NuGet package में एक विस्तार विधि है, और मैंने वीएस 10 - 17 के लिए डीबगर विजुअलाइज़र का एक सेट लिखा है जो the Visual Studio Marketplace में हैं।

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