2013-06-07 8 views
5

आपत्ति जावास्क्रिप्ट में, मैं एक वस्तु के हर संपत्ति एक साधारण के साथ पाश के लिए के रूप मेंजैसे Javascript एफ # रिकॉर्ड के माध्यम से पाशन

var myObj = {x:1, y:2}; 
var i, sum=0; 
for(i in myObj) sum = sum + myObj[i]; 

इस प्रकार मैं अगर मैं एफ # के साथ इसी तरह बात कर सकते हैं सोच रहा हूँ पहुँच सकते हैं।

type MyObj = {x:int; y:int} 
let myObj = {x=1; y=2} 
let allValues:seq<int> = allPropertyValuesIn myObj //How do I implement allPropertyValuesIn 
let sum = allValues |> Seq.fold (+) 0 

स्पष्ट करने के लिए अपने इनपुट के लिए धन्यवाद

संपादित कारण है कि मैं इस तरह के काम करते हैं करने के लिए
मैं एक XML फ़ाइल जनरेटर पर काम कर रहा हूँ चाहता हूँ। इनपुट डेटाबेस से पंक्तियों को पढ़ा जाता है, और xsd पूर्वनिर्धारित है।

आइए कहें कि मेरे पास "उत्पाद" तत्व उत्पन्न होना आवश्यक है और व्यवसाय नियम के आधार पर, उत्पाद के तहत 200 बच्चे तत्व आवश्यक हो सकते हैं, कुछ वैकल्पिक हैं।

1. type Product{ Price:Money; Name:Name; FactoryLocation:Address option ... } 
2. let product = {Price = Money(1.5); Name = Name ("Joe Tooth Paste"); ... } 
3. let child1 = createEl ("Price", product.Price) 
    .. 
203. let allChildren = child1 
         ::child2 
         ::child3 
         .. 
         ::[] 
404. let prodctEl = createElWithCildren ("Product", allChildren) 

यह बहुत कठिन और अन-संक्षिप्त है: this excellent blog से सलाह के बाद, मैं अपनी पहली (बहुत मोटा) उत्पाद रिकार्ड के लिए डिजाइन किया है। एफ # में ऐसी चीज करने का बेहतर तरीका होना चाहिए। मैं प्रतिबिंब विचार पर बहुत ज्यादा नहीं हूं।

क्या कोई अन्य दृष्टिकोण है या मैं बस गलत कर रहा हूं?

+2

यह प्रतिबिंब के साथ संभव है, लेकिन मुझे नहीं लगता कि तेज़, प्रकार सुरक्षित विकल्प मौजूद है। –

+0

"स्पष्ट करने के लिए संपादित करें क्यों ..." आपकी समस्या बहुत बदल गई है:/यदि आप बच्चों की संरचना पर स्वचालित करना चाहते हैं तो आपको अपने बच्चों की संरचना (अपने 200 बच्चों की संरचना) को सामान्य बनाना होगा। – josejuan

उत्तर

5

इस प्रयास करें:

open Microsoft.FSharp.Reflection 

type MyObj = {x:int; y:int} 
let myObj = {x=1; y=2} 
let allValues = FSharpType.GetRecordFields (myObj.GetType()) 
let sum = 
    allValues 
    |> Seq.fold 
     (fun s t -> s + int(t.GetValue(myObj).ToString())) 
     0 
printfn "%d" sum 

हालांकि, जॉन पामर सलाह देती है, वहाँ नहीं कुछ इस तरह से करने के लिए बहुत कई अच्छे कारण हैं।

+2

हालांकि यह उन अच्छे कारणों में से एक है। एक नक्शा की तरह एक संरचना/रिकॉर्ड का इलाज (डेटा संरचना, जो वास्तव में एक संरचना है) सार्वजनिक इंटरफेस में अपने प्रकार के चेकर से अधिक लाभ प्राप्त करने के लिए उपयोगी है। आप वेब एपीआई के सभी संभावित मानकों का प्रतिनिधित्व करने के लिए एक रिकॉर्ड का उपयोग कर सकते हैं (उपयुक्त विकल्प प्रकार सहित)। फिर दृश्यों के पीछे, http payload बनाने के लिए सदस्य नामों की दीवार लिखने के बजाय ऐसा कुछ करें। वॉल-ऑफ-नेम दृष्टिकोण विशेष रूप से रखरखाव के लिए खराब है। – Cogwheel

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